JoyLau's Blog

JoyLau 的技术学习与思考

背景

在群晖的 Docker 组件里添加了个人的私有仓库,发现却无法下载镜像….

分析

在 Docker 组件里添加新的仓库,并设置为使用仓库,发现在仓库里下载镜像总是失败,状态栏提示查看日志,可是在日志里总看不到东西

想了想,可能是新添加的 docker 私服是 http 的服务,而不是 https

方法

  1. 于是我使用 GateOne 组件进入 shell
  2. 使用命令 docker pull xxx:xxx, 发现报错 Get https://172.18.18.90:5000/v2/: http: server gave HTTP response to HTTPS client , 果然是这个问题
  3. 于是找到 Docker 组件的配置文件目录,在 /var/packages/Docker/etc 目录下,添加配置文件 daemon.json
1
2
3
{
"insecure-registries": ["domain:5000"]
}
  1. 重启 Docker 组件, 发现不起作用,在命令行下 pull 依然报错,可想配置文件错了
  2. 转眼看到一个可疑的配置文件 dockerd.json, 里面已经有一些配置了,于是就把配置写到这个里面
  3. 再重启,问题解决.可见群晖对于 docker 是做了一些改变的.

添加环境变量【Registry】

1
2
[Registry]
Root: HKCR; Subkey: "JOY-SECURITY"; ValueType: string; ValueData: "URL:JOY-SECURITY Protocol Handler"; Flags: uninsdeletekey

Root (必需的)

根键。必须是下列值中的一个:

HKCR (HKEY_CLASSES_ROOT)
HKCU (HKEY_CURRENT_USER)
HKLM (HKEY_LOCAL_MACHINE)
HKU (HKEY_USERS)
HKCC (HKEY_CURRENT_CONFIG)

Subkey (必需的)

子键名,可以包含常量。

ValueType

值的数据类型。必须是下面中的一个:

none
string
expandsz
multisz
dword
qword
binary

如果指定了 none (默认设置),安装程序将创建一个没有键值的键,在这种情况下,ValueData 参数将被忽略。
如果指定了 string,安装程序将创建一个字符串 (REG_SZ) 值。
如果指定了 expandsz,安装程序将创建一个扩展字符串 (REG_EXPAND_SZ) 值。
如果指定了 multisz,安装程序将创建一个多行文本 (REG_MULTI_SZ) 值。
如果指定了 dword,安装程序将创建一个32位整数 (REG_DWORD) 值。
如果指定了 qdword,安装程序将创建一个64位整数 (REG_QDWORD) 值。
如果指定了 binary,安装程序将创建一个二进制 (REG_BINARY) 值。

Flags

这个参数是额外选项设置。多个选项可以使用空格隔开。支持下面的选项:

createvalueifdoesntexist
当指定了这个标记,安装程序只在如果没有相同名字的值存在时创建值。如果值类型是 none,或如果你指定了 deletevalue 标记,这个标记无效。

deletekey
当指定了这个标记,安装程序在如果条目存在的情况下,先将尝试删除它,包括其中的所有值和子键。如果 ValueType 不是 none,那么它将创建一个新的键和值。

要防止意外,如果 Subkey 是空白的或只包含反斜框符号,安装时这个标记被忽略。

deletevalue
当指定了这个标记,安装程序在如果值存在的情况下,先将尝试删除值,如果 ValueType 是 none,那么在键不存在的情况下,它将创建键以及新值。

dontcreatekey
当指定了这个标记,如果键已经在用户系统中不存在,安装程序将不尝试创建键或值。如果键不存在,不显示错误消息。

一般来说,这个键与 uninsdeletekey 标记组合使用,在卸载时删除键,但安装时不创建键。

noerror
如果安装程序因任何原因创建键或值失败,不显示错误消息。

preservestringtype
这只在当 ValueType 参数是 string 或 expandsz 时适用。当指定这个标记,并且值不存在或现有的值不是 string 类型 (REG_SZ 或 REG_EXPAND_SZ),它将用 ValueType 指定的类型创建。如果值存在,并且是 string 类型,它将用先存在值的相同值类型替换。

uninsclearvalue
当卸载程序时,设置值数据为空字符 (类型 REG_SZ)。这个标记不能与 uninsdeletekey 标记组合使用。

uninsdeletekey
当卸载程序时,删除整个键,包含其中的所有值和子键。这对于 Windows 自身使用的键明显不是一个好方法。你只能用于你的应用程序特有的键中。

为防止意外,安装期间如果 Subkey 空白或只包含反斜框符号,这个标记被忽略。

uninsdeletekeyifempty
当程序卸载时,如果这个键的内部没有值或子键,则删除这个键。这个标记可以与 uninsdeletevalue 组合使用

为防止意外,安装期间如果 Subkey 空白或只包含反斜框符号,这个标记被忽略。

uninsdeletevalue
当程序卸载时删除该值。这个标记不能与 uninsdeletekeyifempty 组合使用

注意: 在早于 1.1 的 Inno Setup 版本中,你可以使用这个标记连同数据类型 none,那么它的功能与“如果空则删除键”标记一样。这个方法已经不支持了。你必须使用 uninsdeletekeyifempty 标记实现。

添加环境变量【Code】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//添加环境变量
procedure CurStepChanged(CurStep: TSetupStep);
var
oldpath: String;
newpath: String;
ErrorCode: Integer;
begin
if CurStep = ssPostInstall then
begin
RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'Path', oldPath);
newPath := oldPath + ';%JAVA_HOME%\bin\;';
RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'PATH', newPath);
RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'JAVA_HOME', ExpandConstant('{app}\java\jdk1.8.0_45'));
end;
end;

添加环境变量后记得在 setup 中配置 ChangesEnvironment=yes 通知其他应用程序从注册表重新获取环境变量

删除环境变量【Code】

1
2
3
4
5
6
7
8
9
10
11
12
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
oldpath: String;
newpath: String;
begin
if CurUninstallStep = usDone then
RegDeleteValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'JAVA_HOME');
RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'Path', oldPath);
StringChangeEx(oldPath, ';%JAVA_HOME%\bin\;', '', True);
newPath := oldPath;
RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'PATH', newPath);
end;

安装完成后执行脚本

1
2
[Run]
Filename: "{app}\service-install.bat"; Description: "{cm:LaunchProgram,{#StringChange('SERVICE_INSTALL', '&', '&&')}}"; Flags: shellexec postinstall waituntilterminated runascurrentuser

Parameters

程序的可选命令行参数,可以包含常量。

Flags

这个参数是额外选项设置。多个选项可以使用空格隔开。支持下面的选项:

32bit
Causes the {sys} constant to map to the 32-bit System directory when used in the Filename and WorkingDir parameters. This is the default behavior in a 32-bit mode install。

这个标记不能与 shellexec 组合使用。

64bit
Causes the {sys} constant to map to the 64-bit System directory when used in the Filename and WorkingDir parameters. This is the default behavior in a 64-bit mode install。

This flag can only be used when Setup is running on 64-bit Windows, otherwise an error will occur. On an installation supporting both 32- and 64-bit architectures, it is possible to avoid the error by adding a Check: IsWin64 parameter, which will cause the entry to be silently skipped when running on 32-bit Windows。

这个标记不能与 shellexec 组合使用。

hidewizard
如果指定了这个标记,向导将在程序运行期间隐藏。

nowait
如果指定了这个标记,它将在处理下一个 [Run] 条目前或完成安装前不等待进程执行完成。不能与 waituntilidle 或 waituntilterminated 组合使用。

postinstall
仅在 [Run] 段有效。告诉安装程序在安装完成向导页创建一个选择框,用户可以选中或不选中这个选择框从而决定是否处理这个条目。以前这个标记调用 showcheckbox。

如果安装程序已经重新启动了用户的电脑 (安装了一个带 restartreplace 标记的文件或如果 [Setup] 段的 AlwaysRestart 指令是 yes 引起的),选择框没有机会出现,因此这些条目不会被处理。

[Files] 段条目中的 isreadme 标记现在已被废弃。如果编译器带 isreadme 标记的条目,它将从 [Files] 段条目中忽略这个标记,并在 [Run] 段条目列表的开头插入一个生成的 [Run] 条目。这相生成的 [Run] 段条目运行自述文件,并带有 shellexec,skipifdoesntexist,postinstall 和 skipifsilent 标记。

runascurrentuser
如果指定了这个标记,the spawned process will inherit Setup/Uninstall’s user credentials (typically, full administrative privileges)。

This is the default behavior when the postinstall flag is not used。

这个标记不能与 runasoriginaluser 组合使用。

runasoriginaluser
仅在 [Run] 段有效。If this flag is specified and the system is running Windows Vista or later, the spawned process will execute with the (normally non-elevated) credentials of the user that started Setup initially (i.e., the “pre-UAC dialog” credentials)。

This is the default behavior when the postinstall flag is used。

If a user launches Setup by right-clicking its EXE file and selecting “Run as administrator”, then this flag, unfortunately, will have no effect, because Setup has no opportunity to run any code with the original user credentials. The same is true if Setup is launched from an already-elevated process. Note, however, that this is not an Inno Setup-specific limitation; Windows Installer-based installers cannot return to the original user credentials either in such cases。

这个标记不能与 runascurrentuser 组合使用。

runhidden
如果指定了这个标记,它将在隐藏窗口中运行程序。请在执行一个要提示用户输入的程序中不要使用这个标记。

runmaximized
如果指定了这个标记,将在最大化窗口运行程序或文档。

runminimized
如果指定了这个标记,将在最小化窗口运行程序或文档。

shellexec
如果 Filename 不是一个直接可执行文件 (.exe 或 .com 文件),这个标记是必需的。当设置这个标记时,Filename 可以是一个文件夹或任何已注册的文件类型 – 包括 .hlp,.doc 等。该文件将用用户系统中与这个文件类型关联的应用程序打开,与在资源管理器双击文件的方法是相同的。

按默认,当使用 shellexec 标记时,将不等待,直到生成的进程终止。
如果你需要,你必须添加标记 waituntilterminated。注意,如果新进程未生成,它不能执行也将不等待 – 例如,文件指定指定为一个文件夹。

skipifdoesntexist
如果这个标记在 [Run] 段中指定,如果 Filename 不存在,安装程序不显示错误消息。

如果这个标记在 [UninstallRun] 段中指定,如果 Filename 不存在,卸载程序不显示“一些元素不能删除”的警告。

在使用这个标记时, Filename 必须是一个绝对路径。

skipifnotsilent
仅在 [Run] 段有效。告诉安装程序如果安装程序未在后台运行则跳过这个条目。

skipifsilent
仅在 [Run] 段有效。告诉安装程序如果安装程序在后台运行则跳过这个条目。

unchecked
仅在 [Run] 段有效。告诉安装程序初始为不选中选择框。如果用户希望处理这个条目,可以通过选取选择框执行。如果 postinstall 标记未同时指定,这个标记被忽略。

waituntilidle
如果指定了这个标记,它将在未输入期间等待,直到进程等待用户输入,而不是等待进程终止。(调用 WaitForInputIdle Win32 函数。) 不能与 nowait 或 waituntilterminated 组合使用。

waituntilterminated
如果指定这个标记,将等待到进程完全终止。注意这是一个默认动作 (也就是你不需要指定这个标记),除非你使用了 shellexec 标记,在这种情况下,如果你要等待,需要指定这个标记。不能与 nowait 或 waituntilidle 组合使用。

安装前卸载旧版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function InitializeSetup(): boolean;
var
bRes: Boolean;
ResultStr: String;
ResultCode: Integer;
begin
if RegQueryStringValue(HKLM, 'SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{4AA89D60-9EB2-4A69-B73E-67E3AC22CF8E}_is1', 'UninstallString', ResultStr) then
begin
MsgBox('检测到系统之前安装过本程序,即将卸载低版本!', mbInformation, MB_OK);
ResultStr := RemoveQuotes(ResultStr);
bRes := Exec(ResultStr, '/silent', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
if bRes and (ResultCode = 0) then begin
result := true;
Exit;
end else
MsgBox('卸载低版本失败!', mbInformation, MB_OK);
result:= false;
Exit;
end;
result := true;
end;

检测服务是否存在并删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function DeleteService(strExeName: String): Boolean;
var
ErrorCode: Integer;
bRes: Boolean;
strCmdFind: String;
strCmdDelete: String;
begin
strCmdFind := Format('/c sc query "%s"', [strExeName]);
strCmdDelete := Format('/c sc stop "%s" & sc delete "%s"', [strExeName, strExeName]);
bRes := ShellExec('open', ExpandConstant('{cmd}'), strCmdFind, '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
if bRes and (ErrorCode = 0) then begin
if MsgBox('检测到 ' + strExeName + ' 服务存在,需要删除,是否继续?', mbConfirmation, MB_YESNO) = IDYES then begin
bRes := ShellExec('open', ExpandConstant('{cmd}'), strCmdDelete, '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
if bRes and (ErrorCode = 0) then begin
MsgBox('服务 '+strExeName+' 删除成功!', mbInformation, MB_OK);
result := true;
Exit;
end else
MsgBox('删除失败,请手动删除服务 ' + strExeName, mbError, MB_OK);
result := false;
Exit;
end else
result := false;
Exit;
end;
MsgBox('服务 '+strExeName+' 不存在!', mbInformation, MB_OK);
result := true;
end;

执行

执行 git config credential.helper store

或者在 .gitconfig 添加

1
2
[credential]
helper = store

示例代码,10后抛出超时错误,并且取消子线程任务的执行

1
2
3
4
5
6
7
8
9
10
11
12
13
ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<String> future = executorService.submit(() -> {
....
}
);

try {
return future.get(10, TimeUnit.SECONDS);
} catch (Exception e) {
future.cancel(true);
executorService.shutdown();
return new ArrayList<>();
}

背景

最近做了一个小 demo,需要使用到 spring security,于是就把以前写过的 spring security 的代码直接 copy 过来用了,没想到却出现了问题…..

问题

小 demo 直接使用 spring boot 构建,前后端不分离,于是自己写的登录界面,在 spring security 里配置好 loginPage 后,发现只要打开登录页就会无限重定向到登录页,其他任何请求都是如此

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.anonymous().disable()
.csrf().disable()
.authorizeRequests()
.antMatchers("/").permitAll()
.anyRequest().authenticated()//其他请求必须授权后访问
.and()
.formLogin()
.loginPage("/")
.loginProcessingUrl("/login")
.permitAll();//登录请求可以直接访问
}

@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().passwordEncoder(passwordEncoder()).withUser("admin").password(passwordEncoder().encode("123456")).roles("ADMIN");
}

@Bean
public SessionRegistry sessionRegistry(){
return new SessionRegistryImpl();
}

@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}


@Bean
public AuthenticationSuccess authenticationSuccessHandler(){
return new AuthenticationSuccess();
}

@Bean
public AuthenticationFailureHandler authenticationFailureHandler(){
return new AuthenticationFailure();
}
}

分析

一开始的直觉告诉我,登录页的请求 “/“ 没有认证,而没有认证的请求会重定向到登录页,也就还是 “/“,于是就造成了重定向

于是我先添加请求 “/“, 不进行认证即可访问,也就是上面配置的 .antMatchers("/").permitAll()

重启后发现不起作用,依旧无限重定向

然而可怕的是控制台没有打印任何日志….

一下子懵逼了,不知如何解决….

冷静下来分析后—

我是这样解决的

打开 debug 日志

配置 spring security 的日志级别

1
2
3
logging:
level:
org.springframework.security: debug

启动时看到日志截取如下

1
2
3
4
5
6
7
8
9
2019-08-19 15:19:06.628 DEBUG 19133 --- [           main] edFilterInvocationSecurityMetadataSource : Adding web access control expression 'permitAll', for ExactUrl [processUrl='/?error']
2019-08-19 15:19:06.631 DEBUG 19133 --- [ main] edFilterInvocationSecurityMetadataSource : Adding web access control expression 'permitAll', for ExactUrl [processUrl='/login']
2019-08-19 15:19:06.631 DEBUG 19133 --- [ main] edFilterInvocationSecurityMetadataSource : Adding web access control expression 'permitAll', for ExactUrl [processUrl='/']
2019-08-19 15:19:06.631 DEBUG 19133 --- [ main] edFilterInvocationSecurityMetadataSource : Adding web access control expression 'permitAll', for Ant [pattern='/']
2019-08-19 15:19:06.632 DEBUG 19133 --- [ main] edFilterInvocationSecurityMetadataSource : Adding web access control expression 'authenticated', for any request
2019-08-19 15:19:06.646 DEBUG 19133 --- [ main] o.s.s.w.a.i.FilterSecurityInterceptor : Validated configuration attributes
2019-08-19 15:19:06.648 DEBUG 19133 --- [ main] o.s.s.w.a.i.FilterSecurityInterceptor : Validated configuration attributes

2019-08-19 15:34:24.451 INFO 22575 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@32c6d164, org.springframework.security.web.context.SecurityContextPersistenceFilter@390a7532, org.springframework.security.web.header.HeaderWriterFilter@5ebf776c, org.springframework.security.web.authentication.logout.LogoutFilter@523ade68, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@652f26da, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@7d49a1a0, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@3a12f3e7, org.springframework.security.web.session.SessionManagementFilter@54ae1240, org.springframework.security.web.access.ExceptionTranslationFilter@3c62f69a, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@2b3242a5]

可以看到 “/“ 添加成功了,可是为什么好像没有生效呢?

错误信息

继续往下走,刷新登录页,发现控制台打印了错误信息如下“

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
2019-08-19 15:21:16.813 DEBUG 19133 --- [nio-8080-exec-2] o.s.security.web.FilterChainProxy        : / at position 1 of 10 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'
2019-08-19 15:21:16.815 DEBUG 19133 --- [nio-8080-exec-2] o.s.security.web.FilterChainProxy : / at position 2 of 10 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter'
2019-08-19 15:21:16.816 DEBUG 19133 --- [nio-8080-exec-2] w.c.HttpSessionSecurityContextRepository : No HttpSession currently exists
2019-08-19 15:21:16.817 DEBUG 19133 --- [nio-8080-exec-2] w.c.HttpSessionSecurityContextRepository : No SecurityContext was available from the HttpSession: null. A new one will be created.
2019-08-19 15:21:16.822 DEBUG 19133 --- [nio-8080-exec-2] o.s.security.web.FilterChainProxy : / at position 3 of 10 in additional filter chain; firing Filter: 'HeaderWriterFilter'
2019-08-19 15:21:16.825 DEBUG 19133 --- [nio-8080-exec-2] o.s.security.web.FilterChainProxy : / at position 4 of 10 in additional filter chain; firing Filter: 'LogoutFilter'
2019-08-19 15:21:16.825 DEBUG 19133 --- [nio-8080-exec-2] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/logout', GET]
2019-08-19 15:21:16.825 DEBUG 19133 --- [nio-8080-exec-2] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/'; against '/logout'
2019-08-19 15:21:16.826 DEBUG 19133 --- [nio-8080-exec-2] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/logout', POST]
2019-08-19 15:21:16.826 DEBUG 19133 --- [nio-8080-exec-2] o.s.s.w.u.matcher.AntPathRequestMatcher : Request 'GET /' doesn't match 'POST /logout'
2019-08-19 15:21:16.826 DEBUG 19133 --- [nio-8080-exec-2] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/logout', PUT]
2019-08-19 15:21:16.826 DEBUG 19133 --- [nio-8080-exec-2] o.s.s.w.u.matcher.AntPathRequestMatcher : Request 'GET /' doesn't match 'PUT /logout'
2019-08-19 15:21:16.826 DEBUG 19133 --- [nio-8080-exec-2] o.s.s.web.util.matcher.OrRequestMatcher : Trying to match using Ant [pattern='/logout', DELETE]
2019-08-19 15:21:16.827 DEBUG 19133 --- [nio-8080-exec-2] o.s.s.w.u.matcher.AntPathRequestMatcher : Request 'GET /' doesn't match 'DELETE /logout'
2019-08-19 15:21:16.827 DEBUG 19133 --- [nio-8080-exec-2] o.s.s.web.util.matcher.OrRequestMatcher : No matches found
2019-08-19 15:21:16.827 DEBUG 19133 --- [nio-8080-exec-2] o.s.security.web.FilterChainProxy : / at position 5 of 10 in additional filter chain; firing Filter: 'UsernamePasswordAuthenticationFilter'
2019-08-19 15:21:16.827 DEBUG 19133 --- [nio-8080-exec-2] o.s.s.w.u.matcher.AntPathRequestMatcher : Request 'GET /' doesn't match 'POST /login'
2019-08-19 15:21:16.828 DEBUG 19133 --- [nio-8080-exec-2] o.s.security.web.FilterChainProxy : / at position 6 of 10 in additional filter chain; firing Filter: 'RequestCacheAwareFilter'
2019-08-19 15:21:16.828 DEBUG 19133 --- [nio-8080-exec-2] o.s.s.w.s.HttpSessionRequestCache : saved request doesn't match
2019-08-19 15:21:16.829 DEBUG 19133 --- [nio-8080-exec-2] o.s.security.web.FilterChainProxy : / at position 7 of 10 in additional filter chain; firing Filter: 'SecurityContextHolderAwareRequestFilter'
2019-08-19 15:21:16.832 DEBUG 19133 --- [nio-8080-exec-2] o.s.security.web.FilterChainProxy : / at position 8 of 10 in additional filter chain; firing Filter: 'SessionManagementFilter'
2019-08-19 15:21:16.833 DEBUG 19133 --- [nio-8080-exec-2] o.s.security.web.FilterChainProxy : / at position 9 of 10 in additional filter chain; firing Filter: 'ExceptionTranslationFilter'
2019-08-19 15:21:21.085 DEBUG 19133 --- [nio-8080-exec-2] o.s.security.web.FilterChainProxy : / at position 10 of 10 in additional filter chain; firing Filter: 'FilterSecurityInterceptor'
2019-08-19 15:21:21.440 DEBUG 19133 --- [nio-8080-exec-2] o.s.s.w.a.i.FilterSecurityInterceptor : Secure object: FilterInvocation: URL: /; Attributes: [permitAll]
2019-08-19 15:21:21.450 DEBUG 19133 --- [nio-8080-exec-2] o.s.s.w.a.ExceptionTranslationFilter : Authentication exception occurred; redirecting to authentication entry point

org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.credentialsNotFound(AbstractSecurityInterceptor.java:379) ~[spring-security-core-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:223) ~[spring-security-core-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:124) ~[spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91) ~[spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:74) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118) [spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118) [spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357) [spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270) [spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) [spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118) [spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92) [spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118) [spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) [spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118) [spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) [spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118) [spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:41002) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587) [tomcat-embed-core-9.0.22.jar:9.0.22]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.22.jar:9.0.22]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135) [na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [na:na]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.22.jar:9.0.22]
at java.base/java.lang.Thread.run(Thread.java:844) [na:na]

看到2个关键的错误信息:

  1. Authentication exception occurred; redirecting to authentication entry point
  2. An Authentication object was not found in the SecurityContext

意思是认证异常,重定向到认证入口点,异常的原因是在 SecurityContext 没有找到认证信息对象

排查

根据错误信息,我先到 ExceptionTranslationFilter 类中去查看问题出在什么地方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;

try {
chain.doFilter(request, response);

logger.debug("Chain processed normally");
}
catch (IOException ex) {
throw ex;
}
catch (Exception ex) {
// Try to extract a SpringSecurityException from the stacktrace
Throwable[] causeChain = throwableAnalyzer.determineCauseChain(ex);
RuntimeException ase = (AuthenticationException) throwableAnalyzer
.getFirstThrowableOfType(AuthenticationException.class, causeChain);

if (ase == null) {
ase = (AccessDeniedException) throwableAnalyzer.getFirstThrowableOfType(
AccessDeniedException.class, causeChain);
}

if (ase != null) {
if (response.isCommitted()) {
throw new ServletException("Unable to handle the Spring Security Exception because the response is already committed.", ex);
}
handleSpringSecurityException(request, response, chain, ase);
}
else {
// Rethrow ServletExceptions and RuntimeExceptions as-is
if (ex instanceof ServletException) {
throw (ServletException) ex;
}
else if (ex instanceof RuntimeException) {
throw (RuntimeException) ex;
}

// Wrap other Exceptions. This shouldn't actually happen
// as we've already covered all the possibilities for doFilter
throw new RuntimeException(ex);
}
}
}

ExceptionTranslationFilter 没有什么逻辑,都是对异常的处理, 然后直接进入下一个过滤器了,

那么这时我们就需要了解 spring security 的过滤器链的顺序

我们来看最开始打印的 debug 的日志信息,我整理一下,有如下顺序:

WebAsyncManagerIntegrationFilter
SecurityContextPersistenceFilter
HeaderWriterFilter
LogoutFilter
UsernamePasswordAuthenticationFilter
RequestCacheAwareFilter
SecurityContextHolderAwareRequestFilter
SessionManagementFilter
ExceptionTranslationFilter
FilterSecurityInterceptor

这是spring security 的默认过滤器链,完整的过滤器链可以通过查看源码详细看到, 在类 FilterComparator 中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
FilterComparator() {
Step order = new Step(INITIAL_ORDER, ORDER_STEP);
put(ChannelProcessingFilter.class, order.next());
put(ConcurrentSessionFilter.class, order.next());
put(WebAsyncManagerIntegrationFilter.class, order.next());
put(SecurityContextPersistenceFilter.class, order.next());
put(HeaderWriterFilter.class, order.next());
put(CorsFilter.class, order.next());
put(CsrfFilter.class, order.next());
put(LogoutFilter.class, order.next());
filterToOrder.put(
"org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter",
order.next());
put(X509AuthenticationFilter.class, order.next());
put(AbstractPreAuthenticatedProcessingFilter.class, order.next());
filterToOrder.put("org.springframework.security.cas.web.CasAuthenticationFilter",
order.next());
filterToOrder.put(
"org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter",
order.next());
put(UsernamePasswordAuthenticationFilter.class, order.next());
put(ConcurrentSessionFilter.class, order.next());
filterToOrder.put(
"org.springframework.security.openid.OpenIDAuthenticationFilter", order.next());
put(DefaultLoginPageGeneratingFilter.class, order.next());
put(DefaultLogoutPageGeneratingFilter.class, order.next());
put(ConcurrentSessionFilter.class, order.next());
put(DigestAuthenticationFilter.class, order.next());
filterToOrder.put(
"org.springframework.security.oauth2.server.resource.web.BearerTokenAuthenticationFilter", order.next());
put(BasicAuthenticationFilter.class, order.next());
put(RequestCacheAwareFilter.class, order.next());
put(SecurityContextHolderAwareRequestFilter.class, order.next());
put(JaasApiIntegrationFilter.class, order.next());
put(RememberMeAuthenticationFilter.class, order.next());
put(AnonymousAuthenticationFilter.class, order.next());
filterToOrder.put(
"org.springframework.security.oauth2.client.web.OAuth2AuthorizationCodeGrantFilter",
order.next());
put(SessionManagementFilter.class, order.next());
put(ExceptionTranslationFilter.class, order.next());
put(FilterSecurityInterceptor.class, order.next());
put(SwitchUserFilter.class, order.next());
}

回到原来的问题, ExceptionTranslationFilter 过滤器后是 FilterSecurityInterceptor 过滤器

再来看 FilterSecurityInterceptor 的源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
FilterInvocation fi = new FilterInvocation(request, response, chain);
invoke(fi);
}

public void invoke(FilterInvocation fi) throws IOException, ServletException {
if ((fi.getRequest() != null)
&& (fi.getRequest().getAttribute(FILTER_APPLIED) != null)
&& observeOncePerRequest) {
// filter already applied to this request and user wants us to observe
// once-per-request handling, so don't re-do security checking
fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
}
else {
// first time this request being called, so perform security checking
if (fi.getRequest() != null && observeOncePerRequest) {
fi.getRequest().setAttribute(FILTER_APPLIED, Boolean.TRUE);
}

InterceptorStatusToken token = super.beforeInvocation(fi);

try {
fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
}
finally {
super.finallyInvocation(token);
}

super.afterInvocation(token, null);
}
}

这里的看的主要方法是 invoke(fi)

通过调试看到, 问题出在 beforeInvocation(fi) 方法里:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
protected InterceptorStatusToken beforeInvocation(Object object) {
Assert.notNull(object, "Object was null");
final boolean debug = logger.isDebugEnabled();

if (!getSecureObjectClass().isAssignableFrom(object.getClass())) {
throw new IllegalArgumentException(
"Security invocation attempted for object "
+ object.getClass().getName()
+ " but AbstractSecurityInterceptor only configured to support secure objects of type: "
+ getSecureObjectClass());
}

Collection<ConfigAttribute> attributes = this.obtainSecurityMetadataSource()
.getAttributes(object);

if (attributes == null || attributes.isEmpty()) {
if (rejectPublicInvocations) {
throw new IllegalArgumentException(
"Secure object invocation "
+ object
+ " was denied as public invocations are not allowed via this interceptor. "
+ "This indicates a configuration error because the "
+ "rejectPublicInvocations property is set to 'true'");
}

if (debug) {
logger.debug("Public object - authentication not attempted");
}

publishEvent(new PublicInvocationEvent(object));

return null; // no further work post-invocation
}

if (debug) {
logger.debug("Secure object: " + object + "; Attributes: " + attributes);
}

if (SecurityContextHolder.getContext().getAuthentication() == null) {
credentialsNotFound(messages.getMessage(
"AbstractSecurityInterceptor.authenticationNotFound",
"An Authentication object was not found in the SecurityContext"),
object, attributes);
}

Authentication authenticated = authenticateIfRequired();

// Attempt authorization
try {
this.accessDecisionManager.decide(authenticated, object, attributes);
}
catch (AccessDeniedException accessDeniedException) {
publishEvent(new AuthorizationFailureEvent(object, attributes, authenticated,
accessDeniedException));

throw accessDeniedException;
}

if (debug) {
logger.debug("Authorization successful");
}

if (publishAuthorizationSuccess) {
publishEvent(new AuthorizedEvent(object, attributes, authenticated));
}

// Attempt to run as a different user
Authentication runAs = this.runAsManager.buildRunAs(authenticated, object,
attributes);

if (runAs == null) {
if (debug) {
logger.debug("RunAsManager did not change Authentication object");
}

// no further work post-invocation
return new InterceptorStatusToken(SecurityContextHolder.getContext(), false,
attributes, object);
}
else {
if (debug) {
logger.debug("Switching to RunAs Authentication: " + runAs);
}

SecurityContext origCtx = SecurityContextHolder.getContext();
SecurityContextHolder.setContext(SecurityContextHolder.createEmptyContext());
SecurityContextHolder.getContext().setAuthentication(runAs);

// need to revert to token.Authenticated post-invocation
return new InterceptorStatusToken(origCtx, true, attributes, object);
}
}

继续调试,问题定位在了 if (SecurityContextHolder.getContext().getAuthentication() == null)

也就打印出了日志 An Authentication object was not found in the SecurityContext,这也就对的上号了

继续分析

为什么 SecurityContext 里的 Authentication 会为空呢?

据官方文档解释 spring security 默认是会有匿名的 Authentication 的啊

一想到这里,马上看下配置,原来是我禁用了匿名用户, .anonymous().disable() 怪不得这样。。。。

可是一想,为什么以前项目这么配置就没有出现这个问题呢???

对比发现,以前的项目是前后端分离的,不需要配置 loginPage, 而且登录成功和登录失败都是返回状态码和错误信息的,和我的这个小 demo 不一样,这个是前后端不分离的,需要做页面的跳转

为什么如此

这时搞清楚之后,我把 .anonymous().disable() 注释掉再重启,刷新下页面,果然登录页出来了,问题不再了

那么为什么会这样呢???

我仔细分析了一下, 看下注释掉配置会有说明不同

首先从过滤器链来看, 这里我不再贴日志信息了, 过滤器链整理如下:

WebAsyncManagerIntegrationFilter
SecurityContextPersistenceFilter
HeaderWriterFilter
LogoutFilter
UsernamePasswordAuthenticationFilter
RequestCacheAwareFilter
SecurityContextHolderAwareRequestFilter
AnonymousAuthenticationFilter
SessionManagementFilter
ExceptionTranslationFilter
FilterSecurityInterceptor

对比发现,过滤器链里多了一个过滤器 AnonymousAuthenticationFilter,来看看 AnonymousAuthenticationFilter 做了什么事情

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {

if (SecurityContextHolder.getContext().getAuthentication() == null) {
SecurityContextHolder.getContext().setAuthentication(
createAuthentication((HttpServletRequest) req));

if (logger.isDebugEnabled()) {
logger.debug("Populated SecurityContextHolder with anonymous token: '"
+ SecurityContextHolder.getContext().getAuthentication() + "'");
}
}
else {
if (logger.isDebugEnabled()) {
logger.debug("SecurityContextHolder not populated with anonymous token, as it already contained: '"
+ SecurityContextHolder.getContext().getAuthentication() + "'");
}
}

chain.doFilter(req, res);
}

protected Authentication createAuthentication(HttpServletRequest request) {
AnonymousAuthenticationToken auth = new AnonymousAuthenticationToken(key,
principal, authorities);
auth.setDetails(authenticationDetailsSource.buildDetails(request));

return auth;
}

看到了关键信息 createAuthenticationsetAuthentication, 那么在后续的过滤器链中就有了认证信息,不再报错了

这也就是为什么解决了这个问题的原因所在

重定向的原因

至于为什么会无限的重定向到登录页,还得再回过头来看 ExceptionTranslationFilter 类,这里有个处理异常的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
private void handleSpringSecurityException(HttpServletRequest request,
HttpServletResponse response, FilterChain chain, RuntimeException exception)
throws IOException, ServletException {
if (exception instanceof AuthenticationException) {
logger.debug(
"Authentication exception occurred; redirecting to authentication entry point",
exception);

sendStartAuthentication(request, response, chain,
(AuthenticationException) exception);
}
else if (exception instanceof AccessDeniedException) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authenticationTrustResolver.isAnonymous(authentication) || authenticationTrustResolver.isRememberMe(authentication)) {
logger.debug(
"Access is denied (user is " + (authenticationTrustResolver.isAnonymous(authentication) ? "anonymous" : "not fully authenticated") + "); redirecting to authentication entry point",
exception);

sendStartAuthentication(
request,
response,
chain,
new InsufficientAuthenticationException(
messages.getMessage(
"ExceptionTranslationFilter.insufficientAuthentication",
"Full authentication is required to access this resource")));
}
else {
logger.debug(
"Access is denied (user is not anonymous); delegating to AccessDeniedHandler",
exception);

accessDeniedHandler.handle(request, response,
(AccessDeniedException) exception);
}
}
}

protected void sendStartAuthentication(HttpServletRequest request,
HttpServletResponse response, FilterChain chain,
AuthenticationException reason) throws ServletException, IOException {
// SEC-112: Clear the SecurityContextHolder's Authentication, as the
// existing Authentication is no longer considered valid
SecurityContextHolder.getContext().setAuthentication(null);
requestCache.saveRequest(request, response);
logger.debug("Calling Authentication entry point.");
authenticationEntryPoint.commence(request, response, reason);
}

通过调试, 发现进入了 sendStartAuthentication 方法,继续调试,进入 authenticationEntryPoint.commence 查看

实现类为 LoginUrlAuthenticationEntryPoint

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException {

String redirectUrl = null;

if (useForward) {

if (forceHttps && "http".equals(request.getScheme())) {
// First redirect the current request to HTTPS.
// When that request is received, the forward to the login page will be
// used.
redirectUrl = buildHttpsRedirectUrlForRequest(request);
}

if (redirectUrl == null) {
String loginForm = determineUrlToUseForThisRequest(request, response,
authException);

if (logger.isDebugEnabled()) {
logger.debug("Server side forward to: " + loginForm);
}

RequestDispatcher dispatcher = request.getRequestDispatcher(loginForm);

dispatcher.forward(request, response);

return;
}
}
else {
// redirect to login page. Use https if forceHttps true

redirectUrl = buildRedirectUrlToLoginPage(request, response, authException);

}

redirectStrategy.sendRedirect(request, response, redirectUrl);
}

这里的 redirectUrl 通过调试发现就是 "/"

于是无限重定向的原因也清楚了。

总结

解决方式有 2 种:

  1. 上面所说的注释掉 .anonymous().disable()
  2. 配置 webSecurity.ignoring().antMatchers("/")
1
2
3
4
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers("/");
}

这种方法一般是配置系统静态资源用,配置的请求根本不会进入 spring security 的过滤器链,直接放行,
.antMatchers("/").permitAll() 是会进入 spring security 的过滤器链的,这是 2 者的主要区别
结合实际情况,第二种方式不是太好,建议第一种方式。

背景

我这款硕美科耳机是 2015 年入手的,到现在已经 4 年多了,日常使用中汗水已经腐蚀了耳机的皮套和头悬梁的皮套
但是耳机本身是没有任何问题的,只是用起来经常掉皮,我并不想重新再买一个
于是我决定在淘宝上买些配件
把原来腐蚀掉的皮套给换掉

材料

就下面 2 个皮套和一个头悬梁
材料

原来的模样

下面是我耳机没有更换前的模样,掉皮,平时我都是用纸巾包一层在戴到头上使用



动手

  1. 先硬撕掉耳机保护套,撕不掉用剪子剪掉

  2. 撕掉之后使用扁平的螺丝刀沿着边缘将卡口翘出来,像下面这样

  3. 之后将皮套套到卡口的圈中,注意皮套上的一圈洞和卡口上的突起相对应

  4. 将套好的一只耳机沿着之前的翘起的卡口位置在按到耳机架上,另一只耳机也是这样操作

  5. 接下来就是头悬梁的皮套的安装了,这个比较麻烦

  6. 先用小号螺丝刀打开悬梁 2 边的塑料小盒,露出 2 边的钢丝

  7. 用剪刀剪断钢丝,再翘起钢丝边缘的卡扣,把钢丝取出来,另一边也是这样操作

  8. 把新的悬梁换上,把钢丝穿过悬梁的小盒子,在穿进耳机架里面

  9. 打开送的小袋子里面的四个铜帽,用钳子夹紧到耳机架边缘伸出来的钢丝末端


  10. 另一边也是相同的方式安装好

更换完成

这是更换完成后的模样

背景

一次系统重启后,Ubuntu 系统无法正确识别连接的显示器分辨率了,我连接的 2 个显示器,其中一个分辨率正确识别,另一个却无法识别,默认成 1024 的分辨率了

注意

强制设置的分辨率起码显示器得支持

步骤

  1. xrandr 查看当前显示器的设置信息, 记住当前显示接口的名称,我这里是 VGA-1, 而且支持的分辨率列表应该是没有你想要的分辨率,不然的话在设置里就能看到了
  2. 添加一个分辨率,我这里是 1920 * 1080 : cvt 1920 1080; 得到输出: Modeline "1920x1080_60.00" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync
  3. 将 cvt 得到的显示模式使用 xrandr 命令添加:
    sudo xrandr --newmode "1920x1080_60.00" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync
    sudo xrandr --addmode VGA-1 "1920x1080_60.00"
  4. 这样设置重启会失效, 将脚本写到一个文件中,并授予执行权限
1
2
3
4
5
!#/bin/bash
cvt 1920 1080
## 如果登录用户不是 root ,则需要使用 sudo ,sudo 需要输入密码,可使用下面的方式解决
echo "password" | sudo -S xrandr --newmode "1920x1080_60.00" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync
echo "password" | sudo -S xrandr --addmode VGA-1 "1920x1080_60.00"
  1. 在 Ubuntu 中搜索 启动应用程序, 将脚本添加进去,完成.

背景

功能

基于百度地图的路况分析服务目前实现的功能有:

  1. 根据给定的行政区划(省,市,区,县等)获取任一缩放等级下的瓦片
  2. 提取分析拥堵数据(拥堵等级,拥堵点集,拥堵空间数据,拥堵距离,道路代码,省,市,区县,镇,街区,道路名,道路车道数,拥堵方向,拥堵描述,拥堵趋势变化,拥堵时长)
  3. 分析性能监控,日志记录

特性:

  1. 简单: 提供 web 界面,可支持在线查看,分析,调试路况信息
  2. 实时: 提供根据给定的区域范围 (矩形区域) 实时分析该区域拥堵数据的 API
  3. 弹性: 分布式计算分析,弹性增加或减少机器
  4. 易部署: 所有复杂的环境和依赖都已打包成镜像, 一条命令即可部署启动
  5. 少依赖: 服务的地理位置解析不依赖互联网接口及其他第三方接口,全部由分析服务自己解决

输入输出

输入: 百度地图瓦片
输出: 拥堵数据

环境

数据

合肥市(行政区划范围)第 17 等级下的全部地图瓦片, 共 61172 张瓦片,其中有道路信息(截止 2019-06-28) 的有 18092

环境依赖

  1. centOS : 7.5
  2. openjdk : 12
  3. openCV : 4.1.0
  4. docker : 18.09
  5. docker compose : 1.24.0
  6. redis : 5.0.5
  7. zookeeper : 3.5.5
  8. rabbitMQ : 3.7.15-management
  9. mariadb: 10.4.6
  10. postgres : 11.4
  11. node : 8.16.0
  12. PostGIS : 2.5.0
  13. PHP : 7.3.6 (PHP-pgsql, PHP-intl)
  14. Apache : 2.4

测试机器配置

暂时没有找到更合适的机器用来长时间运行测试,本次使用的是公司的机器,运行着几个服务,但对系统资源的占用都不大,可以忽略对本次性能测试的影响

CPU : Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz x64 / 单颗 / 8 核
GPU : Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller / 核显
MEM : 组合内存, 4 个插槽, 共 24G
1. 8G Kingston DDR3 1600MHz
2. 8G Kingston DDR3 1600MHz
3. 4G Samsung DDR3 1600MHz
4. 4G Hynix/Hyundai DDR3 1600MHz
DISK : INTEL SSDSC2BW240H6 240G
NETWORK : Intel Corporation Ethernet Connection I217-LM 1000M

网络 : 中国电信 50M 对等宽带, PING 60ms, 抖动 28ms, 丢包 0% (公司网络正常使用情况下)
局域网 : 100M 局域网

测试

测试说明

  1. 服务部署在单台机器上, 线程跑满
  2. 目前已稳定运行一星期 (2019年06月28日 - 2019年07月05日)
  3. 从中抽取其中 1 天的分析数据 (2019年07月04日13:12:40 - 2019年07月05日13:12:40)
  4. 本次测试的功能包含了已经开发完成的全部功能

测试数据

id task_id max_thread_size start_time end_time total_time network_time all_count error_count congest_count
102 1562217160232 8 2019-07-04 13:12:40 2019-07-04 13:14:16 95 84 18902 0 152
103 1562217280004 8 2019-07-04 13:14:40 2019-07-04 13:16:18 98 89 18902 0 153
104 1562217400004 8 2019-07-04 13:16:40 2019-07-04 13:18:14 94 85 18902 0 142
105 1562217520003 8 2019-07-04 13:18:40 2019-07-04 13:20:18 98 87 18902 0 151
106 1562217640004 8 2019-07-04 13:20:40 2019-07-04 13:22:21 101 90 18902 0 158
107 1562217760003 8 2019-07-04 13:22:40 2019-07-04 13:24:13 93 82 18902 0 166
108 1562217880004 8 2019-07-04 13:24:40 2019-07-04 13:26:16 96 85 18902 0 165
109 1562218000003 8 2019-07-04 13:26:40 2019-07-04 13:28:17 97 87 18902 0 157
110 1562218120004 8 2019-07-04 13:28:40 2019-07-04 13:30:18 98 86 18902 0 171
111 1562218240003 8 2019-07-04 13:30:40 2019-07-04 13:32:16 96 85 18902 0 164
112 1562218360003 8 2019-07-04 13:32:40 2019-07-04 13:34:29 109 97 18902 0 163
113 1562218480004 8 2019-07-04 13:34:40 2019-07-04 13:36:16 96 85 18902 0 169
114 1562218600003 8 2019-07-04 13:36:40 2019-07-04 13:38:17 97 86 18902 0 182
115 1562218720003 8 2019-07-04 13:38:40 2019-07-04 13:40:17 97 86 18902 0 182
116 1562218840004 8 2019-07-04 13:40:40 2019-07-04 13:42:18 98 86 18902 0 201
117 1562218960004 8 2019-07-04 13:42:40 2019-07-04 13:44:19 99 88 18902 0 196
118 1562219080003 8 2019-07-04 13:44:40 2019-07-04 13:46:16 96 84 18902 0 188
119 1562219200003 8 2019-07-04 13:46:40 2019-07-04 13:48:15 95 83 18902 0 174
120 1562219320003 8 2019-07-04 13:48:40 2019-07-04 13:50:16 96 83 18902 0 176
121 1562219440003 8 2019-07-04 13:50:40 2019-07-04 13:52:19 99 86 18902 0 195
122 1562219560003 8 2019-07-04 13:52:40 2019-07-04 13:54:26 106 93 18902 0 182
123 1562219680003 8 2019-07-04 13:54:40 2019-07-04 13:56:27 107 95 18902 0 185
124 1562219800003 8 2019-07-04 13:56:40 2019-07-04 13:58:19 99 89 18902 0 189
125 1562219920003 8 2019-07-04 13:58:40 2019-07-04 14:00:28 108 96 18902 0 195
126 1562220040003 8 2019-07-04 14:00:40 2019-07-04 14:02:25 105 93 18902 0 209
127 1562220160003 8 2019-07-04 14:02:40 2019-07-04 14:04:22 102 90 18902 0 205
128 1562220280003 8 2019-07-04 14:04:40 2019-07-04 14:06:18 98 87 18902 0 214
129 1562220400003 8 2019-07-04 14:06:40 2019-07-04 14:08:16 96 83 18901 1 219
130 1562220520003 8 2019-07-04 14:08:40 2019-07-04 14:10:16 96 83 18902 0 226
131 1562220640003 8 2019-07-04 14:10:40 2019-07-04 14:12:19 99 88 18902 0 240
132 1562220760002 8 2019-07-04 14:12:40 2019-07-04 14:14:18 98 85 18902 0 228
133 1562220880003 8 2019-07-04 14:14:40 2019-07-04 14:16:22 102 89 18902 0 219
134 1562221000003 8 2019-07-04 14:16:40 2019-07-04 14:18:17 97 85 18902 0 230
135 1562221120003 8 2019-07-04 14:18:40 2019-07-04 14:20:20 100 88 18902 0 247
136 1562221240003 8 2019-07-04 14:20:40 2019-07-04 14:22:17 97 86 18902 0 218
137 1562221360003 8 2019-07-04 14:22:40 2019-07-04 14:24:18 98 85 18902 0 256
138 1562221480003 8 2019-07-04 14:24:40 2019-07-04 14:26:23 103 89 18902 0 233
139 1562221600003 8 2019-07-04 14:26:40 2019-07-04 14:28:23 103 89 18902 0 246
140 1562221720003 8 2019-07-04 14:28:40 2019-07-04 14:30:22 102 87 18902 0 241
141 1562221840003 8 2019-07-04 14:30:40 2019-07-04 14:32:15 95 82 18902 0 231
142 1562221960004 8 2019-07-04 14:32:40 2019-07-04 14:34:17 97 83 18902 0 241
143 1562222080003 8 2019-07-04 14:34:40 2019-07-04 14:36:17 97 84 18902 0 241
144 1562222200002 8 2019-07-04 14:36:40 2019-07-04 14:38:52 132 120 18902 0 258
145 1562222340003 8 2019-07-04 14:39:00 2019-07-04 14:40:37 97 82 18901 1 263
146 1562222500043 8 2019-07-04 14:41:40 2019-07-04 14:43:14 94 81 18902 0 219
147 1562222620004 8 2019-07-04 14:43:40 2019-07-04 14:45:29 109 97 18902 0 208
148 1562222740004 8 2019-07-04 14:45:40 2019-07-04 14:47:18 98 84 18902 0 219
149 1562222860004 8 2019-07-04 14:47:40 2019-07-04 14:49:12 92 80 18902 0 237
150 1562222980003 8 2019-07-04 14:49:40 2019-07-04 14:51:12 92 79 18902 0 212
151 1562223100004 8 2019-07-04 14:51:40 2019-07-04 14:53:15 95 81 18902 0 248
152 1562223220003 8 2019-07-04 14:53:40 2019-07-04 14:55:22 102 89 18902 0 242
153 1562223340003 8 2019-07-04 14:55:40 2019-07-04 14:57:18 98 84 18902 0 258
154 1562223460003 8 2019-07-04 14:57:40 2019-07-04 14:59:19 99 84 18902 0 258
155 1562223580003 8 2019-07-04 14:59:40 2019-07-04 15:01:24 104 88 18900 2 270
156 1562223700003 8 2019-07-04 15:01:40 2019-07-04 15:03:18 98 85 18902 0 254
157 1562223820003 8 2019-07-04 15:03:40 2019-07-04 15:05:57 137 113 18902 0 253
158 1562223960003 8 2019-07-04 15:06:00 2019-07-04 15:07:50 110 97 18902 0 262
159 1562224080004 8 2019-07-04 15:08:00 2019-07-04 15:09:44 104 90 18902 0 250
160 1562224200003 8 2019-07-04 15:10:00 2019-07-04 15:11:44 104 92 18902 0 244
161 1562224320004 8 2019-07-04 15:12:00 2019-07-04 15:13:46 106 93 18902 0 259
162 1562224440003 8 2019-07-04 15:14:00 2019-07-04 15:15:42 102 88 18902 0 239
163 1562224560003 8 2019-07-04 15:16:00 2019-07-04 15:17:43 103 89 18902 0 269
164 1562224680003 8 2019-07-04 15:18:00 2019-07-04 15:19:35 95 83 18902 0 241
165 1562224780003 8 2019-07-04 15:19:40 2019-07-04 15:21:19 99 86 18902 0 254
166 1562224900003 8 2019-07-04 15:21:40 2019-07-04 15:23:16 96 83 18902 0 262
167 1562225020003 8 2019-07-04 15:23:40 2019-07-04 15:25:16 96 82 18902 0 268
168 1562225140003 8 2019-07-04 15:25:40 2019-07-04 15:27:35 115 99 18900 2 254
169 1562225260003 8 2019-07-04 15:27:40 2019-07-04 15:29:52 132 118 18902 0 252
170 1562225400003 8 2019-07-04 15:30:00 2019-07-04 15:31:57 117 103 18902 0 240
171 1562225520003 8 2019-07-04 15:32:00 2019-07-04 15:33:44 104 88 18902 0 260
172 1562225640003 8 2019-07-04 15:34:00 2019-07-04 15:35:42 102 88 18902 0 264
173 1562225760003 8 2019-07-04 15:36:00 2019-07-04 15:37:41 101 86 18902 0 277
174 1562225880002 8 2019-07-04 15:38:00 2019-07-04 15:39:50 110 94 18900 2 275
175 1562226000003 8 2019-07-04 15:40:00 2019-07-04 15:41:39 99 84 18902 0 281
176 1562226100003 8 2019-07-04 15:41:40 2019-07-04 15:43:17 97 82 18902 0 304
177 1562226220004 8 2019-07-04 15:43:40 2019-07-04 15:45:21 101 87 18902 0 269
178 1562226340002 8 2019-07-04 15:45:40 2019-07-04 15:47:24 104 89 18902 0 284
179 1562226460003 8 2019-07-04 15:47:40 2019-07-04 15:49:22 102 87 18902 0 290
180 1562226580003 8 2019-07-04 15:49:40 2019-07-04 15:51:23 103 89 18902 0 287
181 1562226700003 8 2019-07-04 15:51:40 2019-07-04 15:53:21 101 89 18902 0 260
182 1562226820003 8 2019-07-04 15:53:40 2019-07-04 15:55:34 114 99 18902 0 276
183 1562226940004 8 2019-07-04 15:55:40 2019-07-04 15:57:50 130 113 18901 1 280
184 1562227080003 8 2019-07-04 15:58:00 2019-07-04 15:59:54 114 99 18902 0 259
185 1562227200003 8 2019-07-04 16:00:00 2019-07-04 16:01:43 103 89 18902 0 258
186 1562227320003 8 2019-07-04 16:02:00 2019-07-04 16:03:48 108 94 18902 0 265
187 1562227440002 8 2019-07-04 16:04:00 2019-07-04 16:05:39 99 86 18902 0 257
188 1562227540003 8 2019-07-04 16:05:40 2019-07-04 16:07:21 101 87 18901 1 251
189 1562227660003 8 2019-07-04 16:07:40 2019-07-04 16:09:20 100 85 18902 0 239
190 1562227780003 8 2019-07-04 16:09:40 2019-07-04 16:11:28 108 95 18902 0 264
191 1562227900003 8 2019-07-04 16:11:40 2019-07-04 16:13:15 95 82 18902 0 284
192 1562228020002 8 2019-07-04 16:13:40 2019-07-04 16:15:46 126 114 18902 0 247
193 1562228160003 8 2019-07-04 16:16:00 2019-07-04 16:17:39 99 86 18902 0 274
194 1562228260003 8 2019-07-04 16:17:40 2019-07-04 16:19:22 102 89 18902 0 269
195 1562228380003 8 2019-07-04 16:19:40 2019-07-04 16:21:28 108 93 18901 1 252
196 1562228500004 8 2019-07-04 16:21:40 2019-07-04 16:23:33 113 97 18899 3 252
197 1562228620003 8 2019-07-04 16:23:40 2019-07-04 16:25:46 126 101 18898 4 269
198 1562228760002 8 2019-07-04 16:26:00 2019-07-04 16:27:51 111 93 18899 3 250
199 1562228880003 8 2019-07-04 16:28:00 2019-07-04 16:29:35 95 82 18902 0 247
200 1562228980002 8 2019-07-04 16:29:40 2019-07-04 16:31:22 102 87 18902 0 252
201 1562229100003 8 2019-07-04 16:31:40 2019-07-04 16:33:21 101 89 18902 0 226
202 1562229220003 8 2019-07-04 16:33:40 2019-07-04 16:35:23 103 91 18902 0 241
203 1562229340002 8 2019-07-04 16:35:40 2019-07-04 16:37:28 108 91 18899 3 266
204 1562229460003 8 2019-07-04 16:37:40 2019-07-04 16:40:41 181 159 18901 1 264
205 1562229660003 8 2019-07-04 16:41:00 2019-07-04 16:42:42 102 87 18902 0 260
206 1562229780002 8 2019-07-04 16:43:00 2019-07-04 16:44:36 96 85 18902 0 240
207 1562229880003 8 2019-07-04 16:44:40 2019-07-04 16:46:20 100 85 18901 1 242
208 1562230000003 8 2019-07-04 16:46:40 2019-07-04 16:48:22 102 89 18902 0 243
209 1562230120002 8 2019-07-04 16:48:40 2019-07-04 16:50:33 113 88 18900 2 255
210 1562230240003 8 2019-07-04 16:50:40 2019-07-04 16:52:27 106 93 18902 0 244
211 1562230360003 8 2019-07-04 16:52:40 2019-07-04 16:54:21 101 88 18902 0 276
212 1562230480003 8 2019-07-04 16:54:40 2019-07-04 16:56:25 105 89 18900 2 284
213 1562230600003 8 2019-07-04 16:56:40 2019-07-04 16:58:19 99 83 18902 0 290
214 1562230720002 8 2019-07-04 16:58:40 2019-07-04 17:00:57 137 97 18894 8 282
215 1562230860003 8 2019-07-04 17:01:00 2019-07-04 17:02:40 100 85 18901 1 264
216 1562230980002 8 2019-07-04 17:03:00 2019-07-04 17:04:50 110 97 18902 0 296
217 1562231100003 8 2019-07-04 17:05:00 2019-07-04 17:06:58 118 102 18902 0 267
218 1562231220003 8 2019-07-04 17:07:00 2019-07-04 17:09:00 120 103 18902 0 289
219 1562231380003 8 2019-07-04 17:09:40 2019-07-04 17:11:37 117 101 18902 0 360
220 1562231500003 8 2019-07-04 17:11:40 2019-07-04 17:13:46 126 100 18901 1 347
221 1562231640003 8 2019-07-04 17:14:00 2019-07-04 17:16:21 141 122 18901 1 342
222 1562231800003 8 2019-07-04 17:16:40 2019-07-04 17:18:52 132 113 18902 0 354
223 1562231940003 8 2019-07-04 17:19:00 2019-07-04 17:20:56 116 97 18901 1 349
224 1562232060003 8 2019-07-04 17:21:00 2019-07-04 17:22:51 111 93 18902 0 352
225 1562232180003 8 2019-07-04 17:23:00 2019-07-04 17:24:44 104 87 18902 0 375
226 1562232300002 8 2019-07-04 17:25:00 2019-07-04 17:27:01 121 91 18899 3 385
227 1562232460002 8 2019-07-04 17:27:40 2019-07-04 17:29:30 110 91 18902 0 390
228 1562232580002 8 2019-07-04 17:29:40 2019-07-04 17:31:47 127 105 18900 2 407
229 1562232720003 8 2019-07-04 17:32:00 2019-07-04 17:33:46 105 86 18902 0 415
230 1562232840003 8 2019-07-04 17:34:00 2019-07-04 17:35:54 114 82 18901 1 431
231 1562232960003 8 2019-07-04 17:36:00 2019-07-04 17:37:56 116 93 18901 1 468
232 1562233080003 8 2019-07-04 17:38:00 2019-07-04 17:39:45 105 82 18902 0 499
233 1562233200003 8 2019-07-04 17:40:00 2019-07-04 17:41:47 107 85 18902 0 490
234 1562233320002 8 2019-07-04 17:42:00 2019-07-04 17:43:55 115 89 18902 0 499
235 1562233440002 8 2019-07-04 17:44:00 2019-07-04 17:45:42 102 78 18902 0 491
236 1562233560003 8 2019-07-04 17:46:00 2019-07-04 17:47:49 109 84 18902 0 506
237 1562233680002 8 2019-07-04 17:48:00 2019-07-04 17:49:46 106 80 18902 0 521
238 1562233800002 8 2019-07-04 17:50:00 2019-07-04 17:51:49 109 83 18902 0 547
239 1562233920003 8 2019-07-04 17:52:00 2019-07-04 17:53:48 108 81 18902 0 558
240 1562234040003 8 2019-07-04 17:54:00 2019-07-04 17:55:51 111 84 18902 0 557
241 1562234160002 8 2019-07-04 17:56:00 2019-07-04 17:57:51 111 82 18902 0 574
242 1562234280002 8 2019-07-04 17:58:00 2019-07-04 17:59:51 111 80 18902 0 613
243 1562234400003 8 2019-07-04 18:00:00 2019-07-04 18:01:58 118 84 18899 3 577
244 1562234520003 8 2019-07-04 18:02:00 2019-07-04 18:03:45 105 78 18902 0 568
245 1562234640003 8 2019-07-04 18:04:00 2019-07-04 18:05:47 107 78 18902 0 554
246 1562234760003 8 2019-07-04 18:06:00 2019-07-04 18:07:47 107 78 18902 0 561
247 1562234880002 8 2019-07-04 18:08:00 2019-07-04 18:09:46 106 81 18902 0 533
248 1562235000003 8 2019-07-04 18:10:00 2019-07-04 18:11:47 107 81 18902 0 530
249 1562235120002 8 2019-07-04 18:12:00 2019-07-04 18:13:48 108 80 18902 0 571
250 1562235240002 8 2019-07-04 18:14:00 2019-07-04 18:15:52 112 81 18902 0 582
251 1562235360003 8 2019-07-04 18:16:00 2019-07-04 18:17:50 110 81 18902 0 602
252 1562235480003 8 2019-07-04 18:18:00 2019-07-04 18:19:48 108 80 18902 0 571
253 1562235600002 8 2019-07-04 18:20:00 2019-07-04 18:21:52 112 81 18902 0 588
254 1562235720003 8 2019-07-04 18:22:00 2019-07-04 18:23:53 113 84 18902 0 588
255 1562235840003 8 2019-07-04 18:24:00 2019-07-04 18:25:48 108 79 18902 0 565
256 1562235960002 8 2019-07-04 18:26:00 2019-07-04 18:27:51 111 81 18902 0 577
257 1562236080003 8 2019-07-04 18:28:00 2019-07-04 18:29:48 108 81 18902 0 558
258 1562236200003 8 2019-07-04 18:30:00 2019-07-04 18:31:50 110 82 18902 0 555
259 1562236320002 8 2019-07-04 18:32:00 2019-07-04 18:33:50 110 82 18902 0 547
260 1562236440004 8 2019-07-04 18:34:00 2019-07-04 18:35:46 106 80 18902 0 546
261 1562236560003 8 2019-07-04 18:36:00 2019-07-04 18:37:51 111 84 18902 0 508
262 1562236680003 8 2019-07-04 18:38:00 2019-07-04 18:39:46 106 81 18902 0 509
263 1562236800003 8 2019-07-04 18:40:00 2019-07-04 18:41:54 114 83 18901 1 511
264 1562236920003 8 2019-07-04 18:42:00 2019-07-04 18:43:49 109 83 18902 0 517
265 1562237040003 8 2019-07-04 18:44:00 2019-07-04 18:45:45 105 81 18902 0 493
266 1562237160003 8 2019-07-04 18:46:00 2019-07-04 18:47:45 105 81 18902 0 498
267 1562237280003 8 2019-07-04 18:48:00 2019-07-04 18:49:47 107 82 18902 0 482
268 1562237400002 8 2019-07-04 18:50:00 2019-07-04 18:51:44 104 80 18902 0 466
269 1562237520003 8 2019-07-04 18:52:00 2019-07-04 18:53:44 104 81 18902 0 458
270 1562237640003 8 2019-07-04 18:54:00 2019-07-04 18:55:42 102 80 18902 0 458
271 1562237760002 8 2019-07-04 18:56:00 2019-07-04 18:57:42 102 80 18902 0 453
272 1562237880003 8 2019-07-04 18:58:00 2019-07-04 18:59:44 104 84 18902 0 440
273 1562238000002 8 2019-07-04 19:00:00 2019-07-04 19:01:41 101 81 18902 0 403
274 1562238120003 8 2019-07-04 19:02:00 2019-07-04 19:03:41 101 83 18902 0 381
275 1562238240002 8 2019-07-04 19:04:00 2019-07-04 19:05:41 101 84 18902 0 349
276 1562238360002 8 2019-07-04 19:06:00 2019-07-04 19:07:37 97 79 18902 0 352
277 1562238460003 8 2019-07-04 19:07:40 2019-07-04 19:09:16 96 79 18902 0 329
278 1562238580002 8 2019-07-04 19:09:40 2019-07-04 19:11:18 98 81 18902 0 354
279 1562238700002 8 2019-07-04 19:11:40 2019-07-04 19:13:17 97 82 18902 0 329
280 1562238820003 8 2019-07-04 19:13:40 2019-07-04 19:15:15 95 81 18902 0 320
281 1562238940002 8 2019-07-04 19:15:40 2019-07-04 19:17:15 95 82 18902 0 296
282 1562239060002 8 2019-07-04 19:17:40 2019-07-04 19:19:17 97 83 18902 0 303
283 1562239180003 8 2019-07-04 19:19:40 2019-07-04 19:21:17 97 82 18902 0 311
284 1562239300002 8 2019-07-04 19:21:40 2019-07-04 19:23:16 96 81 18902 0 304
285 1562239420003 8 2019-07-04 19:23:40 2019-07-04 19:25:12 92 78 18902 0 314
286 1562239540003 8 2019-07-04 19:25:40 2019-07-04 19:27:13 93 80 18902 0 280
287 1562239660003 8 2019-07-04 19:27:40 2019-07-04 19:29:11 91 77 18902 0 299
288 1562239780002 8 2019-07-04 19:29:40 2019-07-04 19:31:14 94 80 18902 0 312
289 1562239900002 8 2019-07-04 19:31:40 2019-07-04 19:33:15 95 83 18902 0 269
290 1562240020002 8 2019-07-04 19:33:40 2019-07-04 19:35:14 94 82 18902 0 264
291 1562240140003 8 2019-07-04 19:35:40 2019-07-04 19:37:18 98 84 18902 0 243
292 1562240260002 8 2019-07-04 19:37:40 2019-07-04 19:39:14 94 82 18902 0 262
293 1562240380003 8 2019-07-04 19:39:40 2019-07-04 19:41:16 96 84 18902 0 275
294 1562240500003 8 2019-07-04 19:41:40 2019-07-04 19:43:18 98 85 18902 0 269
295 1562240620003 8 2019-07-04 19:43:40 2019-07-04 19:45:16 96 83 18902 0 268
296 1562240740003 8 2019-07-04 19:45:40 2019-07-04 19:47:15 95 82 18902 0 258
297 1562240860003 8 2019-07-04 19:47:40 2019-07-04 19:49:18 98 85 18902 0 261
298 1562240980002 8 2019-07-04 19:49:40 2019-07-04 19:51:16 96 83 18902 0 264
299 1562241100003 8 2019-07-04 19:51:40 2019-07-04 19:53:13 93 81 18902 0 256
300 1562241220003 8 2019-07-04 19:53:40 2019-07-04 19:55:14 94 82 18902 0 280
301 1562241340002 8 2019-07-04 19:55:40 2019-07-04 19:57:15 95 82 18902 0 278
302 1562241460003 8 2019-07-04 19:57:40 2019-07-04 19:59:12 92 80 18902 0 265
303 1562241580003 8 2019-07-04 19:59:40 2019-07-04 20:01:14 94 82 18902 0 258
304 1562241700003 8 2019-07-04 20:01:40 2019-07-04 20:03:14 94 82 18902 0 265
305 1562241820003 8 2019-07-04 20:03:40 2019-07-04 20:05:12 92 81 18902 0 266
306 1562241940003 8 2019-07-04 20:05:40 2019-07-04 20:07:16 96 81 18902 0 296
307 1562242060002 8 2019-07-04 20:07:40 2019-07-04 20:09:15 95 80 18902 0 296
308 1562242180002 8 2019-07-04 20:09:40 2019-07-04 20:11:17 97 82 18902 0 306
309 1562242300003 8 2019-07-04 20:11:40 2019-07-04 20:13:16 96 83 18902 0 291
310 1562242420003 8 2019-07-04 20:13:40 2019-07-04 20:15:12 92 80 18902 0 267
311 1562242540002 8 2019-07-04 20:15:40 2019-07-04 20:17:11 91 79 18902 0 255
312 1562242660003 8 2019-07-04 20:17:40 2019-07-04 20:19:16 96 83 18902 0 273
313 1562242780003 8 2019-07-04 20:19:40 2019-07-04 20:21:14 94 82 18902 0 284
314 1562242900002 8 2019-07-04 20:21:40 2019-07-04 20:23:15 95 81 18902 0 260
315 1562243020003 8 2019-07-04 20:23:40 2019-07-04 20:25:12 92 80 18902 0 266
316 1562243140003 8 2019-07-04 20:25:40 2019-07-04 20:27:18 98 87 18902 0 269
317 1562243260008 8 2019-07-04 20:27:40 2019-07-04 20:29:18 98 86 18902 0 297
318 1562243380003 8 2019-07-04 20:29:40 2019-07-04 20:31:20 100 87 18902 0 289
319 1562243500002 8 2019-07-04 20:31:40 2019-07-04 20:33:16 96 83 18902 0 264
320 1562243620002 8 2019-07-04 20:33:40 2019-07-04 20:35:16 96 83 18902 0 278
321 1562243740002 8 2019-07-04 20:35:40 2019-07-04 20:37:15 95 82 18902 0 269
322 1562243860003 8 2019-07-04 20:37:40 2019-07-04 20:39:13 93 81 18902 0 264
323 1562243980002 8 2019-07-04 20:39:40 2019-07-04 20:41:16 96 84 18902 0 236
324 1562244100002 8 2019-07-04 20:41:40 2019-07-04 20:43:16 96 84 18902 0 248
325 1562244220002 8 2019-07-04 20:43:40 2019-07-04 20:45:14 94 82 18902 0 273
326 1562244340002 8 2019-07-04 20:45:40 2019-07-04 20:47:12 92 79 18902 0 256
327 1562244460004 8 2019-07-04 20:47:40 2019-07-04 20:49:15 95 82 18902 0 274
328 1562244580003 8 2019-07-04 20:49:40 2019-07-04 20:51:15 95 82 18902 0 284
329 1562244700002 8 2019-07-04 20:51:40 2019-07-04 20:53:15 95 83 18902 0 276
330 1562244820002 8 2019-07-04 20:53:40 2019-07-04 20:55:15 95 83 18902 0 235
331 1562244940003 8 2019-07-04 20:55:40 2019-07-04 20:57:12 92 80 18902 0 250
332 1562245060003 8 2019-07-04 20:57:40 2019-07-04 20:59:13 93 80 18902 0 273
333 1562245180003 8 2019-07-04 20:59:40 2019-07-04 21:01:10 90 78 18902 0 259
334 1562245300002 8 2019-07-04 21:01:40 2019-07-04 21:03:13 93 80 18902 0 214
335 1562245420002 8 2019-07-04 21:03:40 2019-07-04 21:05:11 91 79 18902 0 226
336 1562245540002 8 2019-07-04 21:05:40 2019-07-04 21:07:15 95 84 18902 0 237
337 1562245660002 8 2019-07-04 21:07:40 2019-07-04 21:09:11 91 80 18902 0 219
338 1562245780003 8 2019-07-04 21:09:40 2019-07-04 21:11:19 99 87 18902 0 236
339 1562245900002 8 2019-07-04 21:11:40 2019-07-04 21:13:10 90 81 18902 0 220
340 1562246020003 8 2019-07-04 21:13:40 2019-07-04 21:15:13 93 81 18902 0 222
341 1562246140003 8 2019-07-04 21:15:40 2019-07-04 21:17:10 90 79 18902 0 197
342 1562246260003 8 2019-07-04 21:17:40 2019-07-04 21:19:11 91 79 18902 0 218
343 1562246380002 8 2019-07-04 21:19:40 2019-07-04 21:21:15 95 83 18902 0 212
344 1562246500003 8 2019-07-04 21:21:40 2019-07-04 21:23:14 94 82 18902 0 199
345 1562246620002 8 2019-07-04 21:23:40 2019-07-04 21:25:14 94 82 18902 0 208
346 1562246740003 8 2019-07-04 21:25:40 2019-07-04 21:27:14 94 83 18902 0 212
347 1562246860003 8 2019-07-04 21:27:40 2019-07-04 21:29:14 94 83 18902 0 211
348 1562246980003 8 2019-07-04 21:29:40 2019-07-04 21:31:16 96 85 18902 0 207
349 1562247100003 8 2019-07-04 21:31:40 2019-07-04 21:33:19 99 87 18902 0 212
350 1562247220002 8 2019-07-04 21:33:40 2019-07-04 21:35:20 100 89 18902 0 193
351 1562247340002 8 2019-07-04 21:35:40 2019-07-04 21:37:23 103 91 18902 0 198
352 1562247460002 8 2019-07-04 21:37:40 2019-07-04 21:39:16 96 85 18902 0 206
353 1562247580002 8 2019-07-04 21:39:40 2019-07-04 21:41:13 93 81 18902 0 223
354 1562247700002 8 2019-07-04 21:41:40 2019-07-04 21:43:14 94 82 18902 0 210
355 1562247820002 8 2019-07-04 21:43:40 2019-07-04 21:45:13 93 81 18902 0 209
356 1562247940002 8 2019-07-04 21:45:40 2019-07-04 21:47:09 89 78 18902 0 191
357 1562248060003 8 2019-07-04 21:47:40 2019-07-04 21:49:12 92 81 18902 0 187
358 1562248180002 8 2019-07-04 21:49:40 2019-07-04 21:51:11 91 80 18902 0 181
359 1562248300003 8 2019-07-04 21:51:40 2019-07-04 21:53:13 93 82 18902 0 185
360 1562248420003 8 2019-07-04 21:53:40 2019-07-04 21:55:12 92 81 18902 0 173
361 1562248540002 8 2019-07-04 21:55:40 2019-07-04 21:57:06 86 77 18902 0 158
362 1562248660034 8 2019-07-04 21:57:40 2019-07-04 21:59:12 92 82 18902 0 178
363 1562248780002 8 2019-07-04 21:59:40 2019-07-04 22:01:14 94 83 18902 0 182
364 1562248900002 8 2019-07-04 22:01:40 2019-07-04 22:03:12 92 79 18902 0 195
365 1562249020002 8 2019-07-04 22:03:40 2019-07-04 22:05:10 90 80 18902 0 189
366 1562249140003 8 2019-07-04 22:05:40 2019-07-04 22:07:13 93 82 18902 0 171
367 1562249260002 8 2019-07-04 22:07:40 2019-07-04 22:09:19 99 88 18902 0 170
368 1562249380002 8 2019-07-04 22:09:40 2019-07-04 22:11:16 96 87 18902 0 173
369 1562249500003 8 2019-07-04 22:11:40 2019-07-04 22:13:19 99 89 18902 0 175
370 1562249620003 8 2019-07-04 22:13:40 2019-07-04 22:15:16 96 86 18902 0 153
371 1562249740002 8 2019-07-04 22:15:40 2019-07-04 22:17:15 95 85 18902 0 171
372 1562249860003 8 2019-07-04 22:17:40 2019-07-04 22:19:12 92 81 18902 0 193
373 1562249980002 8 2019-07-04 22:19:40 2019-07-04 22:21:10 90 80 18902 0 172
374 1562250100002 8 2019-07-04 22:21:40 2019-07-04 22:23:11 91 81 18902 0 158
375 1562250220003 8 2019-07-04 22:23:40 2019-07-04 22:25:10 90 81 18902 0 159
376 1562250340003 8 2019-07-04 22:25:40 2019-07-04 22:27:11 91 82 18902 0 146
377 1562250460002 8 2019-07-04 22:27:40 2019-07-04 22:29:11 91 82 18902 0 153
378 1562250580002 8 2019-07-04 22:29:40 2019-07-04 22:31:07 87 78 18902 0 132
379 1562250700003 8 2019-07-04 22:31:40 2019-07-04 22:33:12 92 83 18902 0 131
380 1562250820002 8 2019-07-04 22:33:40 2019-07-04 22:35:13 93 84 18902 0 133
381 1562250940003 8 2019-07-04 22:35:40 2019-07-04 22:37:16 96 86 18902 0 143
382 1562251060002 8 2019-07-04 22:37:40 2019-07-04 22:39:15 95 84 18902 0 145
383 1562251180003 8 2019-07-04 22:39:40 2019-07-04 22:41:13 93 83 18902 0 142
384 1562251300003 8 2019-07-04 22:41:40 2019-07-04 22:43:10 90 80 18902 0 127
385 1562251420004 8 2019-07-04 22:43:40 2019-07-04 22:45:08 88 78 18902 0 140
386 1562251540004 8 2019-07-04 22:45:40 2019-07-04 22:47:09 89 78 18902 0 145
387 1562251660003 8 2019-07-04 22:47:40 2019-07-04 22:49:11 91 81 18902 0 142
388 1562251780002 8 2019-07-04 22:49:40 2019-07-04 22:51:08 88 78 18902 0 137
389 1562251900003 8 2019-07-04 22:51:40 2019-07-04 22:53:15 95 86 18902 0 142
390 1562252020004 8 2019-07-04 22:53:40 2019-07-04 22:55:10 90 81 18902 0 138
391 1562252140002 8 2019-07-04 22:55:40 2019-07-04 22:57:08 88 79 18902 0 136
392 1562252260004 8 2019-07-04 22:57:40 2019-07-04 22:59:13 93 84 18902 0 141
393 1562252380005 8 2019-07-04 22:59:40 2019-07-04 23:01:13 93 84 18902 0 117
394 1562252500005 8 2019-07-04 23:01:40 2019-07-04 23:03:12 92 82 18902 0 124
395 1562252620003 8 2019-07-04 23:03:40 2019-07-04 23:05:13 93 83 18902 0 118
396 1562252740002 8 2019-07-04 23:05:40 2019-07-04 23:07:11 91 82 18902 0 106
397 1562252860002 8 2019-07-04 23:07:40 2019-07-04 23:09:11 91 81 18902 0 125
398 1562252980003 8 2019-07-04 23:09:40 2019-07-04 23:11:11 91 81 18902 0 144
399 1562253100002 8 2019-07-04 23:11:40 2019-07-04 23:13:13 93 83 18902 0 141
400 1562253220005 8 2019-07-04 23:13:40 2019-07-04 23:15:15 95 86 18902 0 135
401 1562253340004 8 2019-07-04 23:15:40 2019-07-04 23:17:16 96 86 18902 0 141
402 1562253460005 8 2019-07-04 23:17:40 2019-07-04 23:19:12 92 83 18902 0 126
403 1562253580004 8 2019-07-04 23:19:40 2019-07-04 23:21:11 91 82 18902 0 118
404 1562253700003 8 2019-07-04 23:21:40 2019-07-04 23:23:10 90 82 18902 0 107
405 1562253820006 8 2019-07-04 23:23:40 2019-07-04 23:25:10 90 80 18902 0 123
406 1562253940005 8 2019-07-04 23:25:40 2019-07-04 23:27:09 89 81 18902 0 105
407 1562254060006 8 2019-07-04 23:27:40 2019-07-04 23:29:14 94 85 18902 0 106
408 1562254180008 8 2019-07-04 23:29:40 2019-07-04 23:31:13 93 85 18902 0 109
409 1562254300005 8 2019-07-04 23:31:40 2019-07-04 23:33:13 93 85 18902 0 89
410 1562254420003 8 2019-07-04 23:33:40 2019-07-04 23:35:13 93 85 18902 0 93
411 1562254540006 8 2019-07-04 23:35:40 2019-07-04 23:37:13 93 85 18902 0 99
412 1562254660006 8 2019-07-04 23:37:40 2019-07-04 23:39:10 90 81 18902 0 107
413 1562254780004 8 2019-07-04 23:39:40 2019-07-04 23:41:08 88 79 18902 0 108
414 1562254900005 8 2019-07-04 23:41:40 2019-07-04 23:43:05 85 76 18902 0 112
415 1562255020004 8 2019-07-04 23:43:40 2019-07-04 23:45:10 90 81 18902 0 116
416 1562255140004 8 2019-07-04 23:45:40 2019-07-04 23:47:10 90 81 18902 0 122
417 1562255260005 8 2019-07-04 23:47:40 2019-07-04 23:49:12 92 82 18902 0 110
418 1562255380004 8 2019-07-04 23:49:40 2019-07-04 23:51:15 95 86 18902 0 126
419 1562255500005 8 2019-07-04 23:51:40 2019-07-04 23:53:15 95 86 18902 0 121
420 1562255620004 8 2019-07-04 23:53:40 2019-07-04 23:55:13 93 84 18902 0 110
421 1562255740005 8 2019-07-04 23:55:40 2019-07-04 23:57:10 90 81 18902 0 116
422 1562255860005 8 2019-07-04 23:57:40 2019-07-04 23:59:07 87 78 18902 0 128
423 1562255980005 8 2019-07-04 23:59:40 2019-07-05 00:01:07 87 79 18902 0 110
424 1562256100005 8 2019-07-05 00:01:40 2019-07-05 00:03:07 87 79 18902 0 97
425 1562256220005 8 2019-07-05 00:03:40 2019-07-05 00:05:09 89 81 18902 0 105
426 1562256340006 8 2019-07-05 00:05:40 2019-07-05 00:07:08 88 80 18902 0 97
427 1562256460006 8 2019-07-05 00:07:40 2019-07-05 00:09:09 89 80 18902 0 102
428 1562256580005 8 2019-07-05 00:09:40 2019-07-05 00:11:05 85 77 18902 0 101
429 1562256700006 8 2019-07-05 00:11:40 2019-07-05 00:13:08 88 81 18902 0 92
430 1562256820005 8 2019-07-05 00:13:40 2019-07-05 00:15:08 88 81 18902 0 93
431 1562256940005 8 2019-07-05 00:15:40 2019-07-05 00:17:06 86 78 18902 0 85
432 1562257060006 8 2019-07-05 00:17:40 2019-07-05 00:19:10 90 82 18902 0 84
433 1562257180006 8 2019-07-05 00:19:40 2019-07-05 00:21:09 89 81 18902 0 89
434 1562257300005 8 2019-07-05 00:21:40 2019-07-05 00:23:03 83 75 18902 0 83
435 1562257420005 8 2019-07-05 00:23:40 2019-07-05 00:25:05 85 77 18902 0 89
436 1562257540004 8 2019-07-05 00:25:40 2019-07-05 00:27:05 85 77 18902 0 96
437 1562257660005 8 2019-07-05 00:27:40 2019-07-05 00:29:15 95 87 18902 0 107
438 1562257780003 8 2019-07-05 00:29:40 2019-07-05 00:31:15 95 87 18902 0 97
439 1562257900005 8 2019-07-05 00:31:40 2019-07-05 00:33:16 96 86 18902 0 107
440 1562258020005 8 2019-07-05 00:33:40 2019-07-05 00:35:13 93 84 18902 0 111
441 1562258140005 8 2019-07-05 00:35:40 2019-07-05 00:37:10 90 82 18902 0 99
442 1562258260005 8 2019-07-05 00:37:40 2019-07-05 00:39:10 90 82 18902 0 92
443 1562258380004 8 2019-07-05 00:39:40 2019-07-05 00:41:11 91 83 18902 0 109
444 1562258500013 8 2019-07-05 00:41:40 2019-07-05 00:43:11 91 82 18902 0 105
445 1562258620292 8 2019-07-05 00:43:40 2019-07-05 00:45:08 88 80 18902 0 105
446 1562258740004 8 2019-07-05 00:45:40 2019-07-05 00:47:00 80 72 18902 0 106
447 1562258860002 8 2019-07-05 00:47:40 2019-07-05 00:49:15 95 86 18902 0 102
448 1562258980004 8 2019-07-05 00:49:40 2019-07-05 00:51:10 90 82 18902 0 105
449 1562259100004 8 2019-07-05 00:51:40 2019-07-05 00:53:08 88 80 18902 0 78
450 1562259220002 8 2019-07-05 00:53:40 2019-07-05 00:55:10 90 83 18902 0 83
451 1562259340004 8 2019-07-05 00:55:40 2019-07-05 00:57:11 91 84 18902 0 80
452 1562259460004 8 2019-07-05 00:57:40 2019-07-05 00:59:12 92 85 18902 0 76
453 1562259580006 8 2019-07-05 00:59:40 2019-07-05 01:01:12 92 84 18902 0 84
454 1562259700005 8 2019-07-05 01:01:40 2019-07-05 01:03:12 92 84 18902 0 88
455 1562259820005 8 2019-07-05 01:03:40 2019-07-05 01:05:09 89 81 18902 0 83
456 1562259940004 8 2019-07-05 01:05:40 2019-07-05 01:07:12 92 84 18902 0 97
457 1562260060005 8 2019-07-05 01:07:40 2019-07-05 01:09:16 95 87 18902 0 98
458 1562260180004 8 2019-07-05 01:09:40 2019-07-05 01:11:14 94 86 18902 0 88
459 1562260300005 8 2019-07-05 01:11:40 2019-07-05 01:13:12 92 84 18902 0 101
460 1562260420005 8 2019-07-05 01:13:40 2019-07-05 01:15:12 92 84 18902 0 107
461 1562260540004 8 2019-07-05 01:15:40 2019-07-05 01:17:13 93 85 18902 0 102
462 1562260660004 8 2019-07-05 01:17:40 2019-07-05 01:19:16 96 88 18902 0 96
463 1562260780004 8 2019-07-05 01:19:40 2019-07-05 01:21:18 98 90 18902 0 97
464 1562260900004 8 2019-07-05 01:21:40 2019-07-05 01:23:15 95 87 18902 0 91
465 1562261020005 8 2019-07-05 01:23:40 2019-07-05 01:25:13 93 85 18902 0 97
466 1562261140004 8 2019-07-05 01:25:40 2019-07-05 01:27:13 93 85 18902 0 93
467 1562261260005 8 2019-07-05 01:27:40 2019-07-05 01:29:12 92 85 18902 0 82
468 1562261380005 8 2019-07-05 01:29:40 2019-07-05 01:31:07 87 79 18902 0 82
469 1562261500005 8 2019-07-05 01:31:40 2019-07-05 01:33:12 92 85 18902 0 74
470 1562261620007 8 2019-07-05 01:33:40 2019-07-05 01:35:11 91 83 18902 0 74
471 1562261740005 8 2019-07-05 01:35:40 2019-07-05 01:37:12 92 85 18902 0 85
472 1562261860006 8 2019-07-05 01:37:40 2019-07-05 01:39:16 96 88 18902 0 96
473 1562261980005 8 2019-07-05 01:39:40 2019-07-05 01:41:12 92 84 18902 0 72
474 1562262100004 8 2019-07-05 01:41:40 2019-07-05 01:43:10 90 82 18902 0 81
475 1562262220004 8 2019-07-05 01:43:40 2019-07-05 01:45:05 85 78 18902 0 83
476 1562262340007 8 2019-07-05 01:45:40 2019-07-05 01:47:04 84 77 18902 0 75
477 1562262460010 8 2019-07-05 01:47:40 2019-07-05 01:49:17 97 90 18902 0 77
478 1562262580007 8 2019-07-05 01:49:40 2019-07-05 01:51:13 93 85 18902 0 97
479 1562262700005 8 2019-07-05 01:51:40 2019-07-05 01:53:13 93 86 18902 0 85
480 1562262954308 8 2019-07-05 01:55:54 2019-07-05 01:57:24 90 81 18902 0 75
481 1562263060006 8 2019-07-05 01:57:40 2019-07-05 01:59:07 87 80 18902 0 78
482 1562263180006 8 2019-07-05 01:59:40 2019-07-05 02:01:12 92 85 18902 0 86
483 1562263300006 8 2019-07-05 02:01:40 2019-07-05 02:03:12 92 84 18902 0 88
484 1562263420005 8 2019-07-05 02:03:40 2019-07-05 02:05:08 88 80 18902 0 89
485 1562263540008 8 2019-07-05 02:05:40 2019-07-05 02:07:06 86 77 18902 0 92
486 1562263660005 8 2019-07-05 02:07:40 2019-07-05 02:09:03 83 76 18902 0 90
487 1562263780006 8 2019-07-05 02:09:40 2019-07-05 02:11:15 95 88 18902 0 83
488 1562263900003 8 2019-07-05 02:11:40 2019-07-05 02:13:17 97 88 18902 0 83
489 1562264020005 8 2019-07-05 02:13:40 2019-07-05 02:15:12 92 84 18902 0 94
490 1562264140005 8 2019-07-05 02:15:40 2019-07-05 02:17:11 91 83 18902 0 91
491 1562264260005 8 2019-07-05 02:17:40 2019-07-05 02:19:10 90 83 18902 0 83
492 1562264380004 8 2019-07-05 02:19:40 2019-07-05 02:21:10 90 83 18902 0 82
493 1562264500004 8 2019-07-05 02:21:40 2019-07-05 02:23:11 91 83 18902 0 90
494 1562264620006 8 2019-07-05 02:23:40 2019-07-05 02:25:11 91 83 18902 0 82
495 1562264740007 8 2019-07-05 02:25:40 2019-07-05 02:27:11 91 83 18902 0 81
496 1562264860005 8 2019-07-05 02:27:40 2019-07-05 02:29:11 91 83 18902 0 86
497 1562264980010 8 2019-07-05 02:29:40 2019-07-05 02:31:10 90 83 18902 0 90
498 1562265100006 8 2019-07-05 02:31:40 2019-07-05 02:33:12 92 83 18902 0 89
499 1562265220006 8 2019-07-05 02:33:40 2019-07-05 02:35:11 91 83 18902 0 85
500 1562265340008 8 2019-07-05 02:35:40 2019-07-05 02:37:13 93 84 18902 0 90
501 1562265460006 8 2019-07-05 02:37:40 2019-07-05 02:39:13 93 86 18902 0 74
502 1562265580006 8 2019-07-05 02:39:40 2019-07-05 02:41:14 94 86 18902 0 91
503 1562265700004 8 2019-07-05 02:41:40 2019-07-05 02:43:14 94 85 18902 0 97
504 1562265820005 8 2019-07-05 02:43:40 2019-07-05 02:45:11 91 82 18902 0 99
505 1562265940004 8 2019-07-05 02:45:40 2019-07-05 02:47:02 82 75 18902 0 108
506 1562266060005 8 2019-07-05 02:47:40 2019-07-05 02:49:08 88 80 18902 0 107
507 1562266180006 8 2019-07-05 02:49:40 2019-07-05 02:51:08 88 80 18902 0 98
508 1562266300003 8 2019-07-05 02:51:40 2019-07-05 02:53:07 87 78 18902 0 107
509 1562266420003 8 2019-07-05 02:53:40 2019-07-05 02:55:04 84 77 18902 0 88
510 1562266540003 8 2019-07-05 02:55:40 2019-07-05 02:57:03 83 74 18902 0 107
511 1562266660006 8 2019-07-05 02:57:40 2019-07-05 02:59:13 93 85 18902 0 92
512 1562266780005 8 2019-07-05 02:59:40 2019-07-05 03:01:10 90 83 18902 0 90
513 1562266900006 8 2019-07-05 03:01:40 2019-07-05 03:03:13 93 85 18902 0 100
514 1562267020031 8 2019-07-05 03:03:40 2019-07-05 03:05:13 93 85 18902 0 101
515 1562267140284 8 2019-07-05 03:05:40 2019-07-05 03:07:15 94 87 18902 0 89
516 1562267260005 8 2019-07-05 03:07:40 2019-07-05 03:09:16 96 88 18902 0 87
517 1562267380273 8 2019-07-05 03:09:40 2019-07-05 03:11:16 96 87 18902 0 97
518 1562267500290 8 2019-07-05 03:11:40 2019-07-05 03:13:14 94 86 18902 0 92
519 1562267620291 8 2019-07-05 03:13:40 2019-07-05 03:15:14 93 86 18902 0 92
520 1562267740004 8 2019-07-05 03:15:40 2019-07-05 03:17:08 88 80 18902 0 79
521 1562267860005 8 2019-07-05 03:17:40 2019-07-05 03:19:03 83 76 18902 0 63
522 1562267980004 8 2019-07-05 03:19:40 2019-07-05 03:21:07 87 80 18902 0 52
523 1562268100005 8 2019-07-05 03:21:40 2019-07-05 03:23:06 86 79 18902 0 55
524 1562268220005 8 2019-07-05 03:23:40 2019-07-05 03:25:02 82 75 18902 0 55
525 1562268340005 8 2019-07-05 03:25:40 2019-07-05 03:27:04 84 77 18902 0 63
526 1562268460004 8 2019-07-05 03:27:40 2019-07-05 03:29:06 86 79 18902 0 67
527 1562268580005 8 2019-07-05 03:29:40 2019-07-05 03:31:10 90 83 18902 0 51
528 1562268700005 8 2019-07-05 03:31:40 2019-07-05 03:33:10 90 82 18902 0 66
529 1562268820005 8 2019-07-05 03:33:40 2019-07-05 03:35:11 91 84 18902 0 63
530 1562268940004 8 2019-07-05 03:35:40 2019-07-05 03:37:12 92 85 18902 0 51
531 1562269060003 8 2019-07-05 03:37:40 2019-07-05 03:39:12 92 85 18902 0 62
532 1562269180006 8 2019-07-05 03:39:40 2019-07-05 03:41:13 93 85 18902 0 61
533 1562269300041 8 2019-07-05 03:41:40 2019-07-05 03:43:12 92 85 18902 0 61
534 1562269420005 8 2019-07-05 03:43:40 2019-07-05 03:45:12 92 85 18902 0 71
535 1562269540005 8 2019-07-05 03:45:40 2019-07-05 03:47:12 92 85 18902 0 67
536 1562269660005 8 2019-07-05 03:47:40 2019-07-05 03:49:11 91 84 18902 0 79
537 1562269780005 8 2019-07-05 03:49:40 2019-07-05 03:51:11 91 83 18902 0 74
538 1562269900004 8 2019-07-05 03:51:40 2019-07-05 03:53:11 91 83 18902 0 81
539 1562270020005 8 2019-07-05 03:53:40 2019-07-05 03:55:11 91 83 18902 0 80
540 1562270140005 8 2019-07-05 03:55:40 2019-07-05 03:57:11 91 83 18902 0 73
541 1562270260305 8 2019-07-05 03:57:40 2019-07-05 03:59:09 88 81 18902 0 67
542 1562270380004 8 2019-07-05 03:59:40 2019-07-05 04:01:08 88 80 18902 0 59
543 1562270500005 8 2019-07-05 04:01:40 2019-07-05 04:03:10 90 83 18902 0 60
544 1562270620003 8 2019-07-05 04:03:40 2019-07-05 04:05:11 91 83 18902 0 70
545 1562270740003 8 2019-07-05 04:05:40 2019-07-05 04:07:11 91 83 18902 0 67
546 1562270860004 8 2019-07-05 04:07:40 2019-07-05 04:09:11 91 82 18902 0 74
547 1562270980007 8 2019-07-05 04:09:40 2019-07-05 04:11:11 91 83 18902 0 74
548 1562271100006 8 2019-07-05 04:11:40 2019-07-05 04:13:12 92 83 18902 0 67
549 1562271220003 8 2019-07-05 04:13:40 2019-07-05 04:15:11 91 84 18902 0 61
550 1562271340003 8 2019-07-05 04:15:40 2019-07-05 04:17:13 93 86 18902 0 73
551 1562271460005 8 2019-07-05 04:17:40 2019-07-05 04:19:16 96 88 18902 0 74
552 1562271580010 8 2019-07-05 04:19:40 2019-07-05 04:21:14 94 86 18902 0 78
553 1562271700004 8 2019-07-05 04:21:40 2019-07-05 04:23:12 92 85 18902 0 83
554 1562271820005 8 2019-07-05 04:23:40 2019-07-05 04:25:12 92 84 18902 0 65
555 1562271940004 8 2019-07-05 04:25:40 2019-07-05 04:27:12 92 85 18902 0 75
556 1562272060003 8 2019-07-05 04:27:40 2019-07-05 04:29:13 93 85 18902 0 72
557 1562272180002 8 2019-07-05 04:29:40 2019-07-05 04:31:15 95 87 18902 0 81
558 1562272300005 8 2019-07-05 04:31:40 2019-07-05 04:33:15 95 87 18902 0 88
559 1562272420003 8 2019-07-05 04:33:40 2019-07-05 04:35:14 94 87 18902 0 85
560 1562272540002 8 2019-07-05 04:35:40 2019-07-05 04:37:13 93 85 18902 0 72
561 1562272660005 8 2019-07-05 04:37:40 2019-07-05 04:39:09 89 81 18902 0 70
562 1562272780004 8 2019-07-05 04:39:40 2019-07-05 04:41:07 87 79 18902 0 84
563 1562272900004 8 2019-07-05 04:41:40 2019-07-05 04:43:07 87 79 18902 0 80
564 1562273020005 8 2019-07-05 04:43:40 2019-07-05 04:45:05 85 77 18902 0 76
565 1562273140005 8 2019-07-05 04:45:40 2019-07-05 04:47:11 91 84 18902 0 61
566 1562273260004 8 2019-07-05 04:47:40 2019-07-05 04:49:12 92 84 18902 0 68
567 1562273380288 8 2019-07-05 04:49:40 2019-07-05 04:51:12 92 84 18902 0 63
568 1562273500174 8 2019-07-05 04:51:40 2019-07-05 04:53:12 91 84 18902 0 58
569 1562273620003 8 2019-07-05 04:53:40 2019-07-05 04:55:11 91 84 18902 0 50
570 1562273740003 8 2019-07-05 04:55:40 2019-07-05 04:57:10 90 83 18902 0 57
571 1562273860002 8 2019-07-05 04:57:40 2019-07-05 04:59:10 90 83 18902 0 55
572 1562273980003 8 2019-07-05 04:59:40 2019-07-05 05:01:10 90 82 18902 0 56
573 1562274100002 8 2019-07-05 05:01:40 2019-07-05 05:03:10 90 82 18902 0 62
574 1562274220003 8 2019-07-05 05:03:40 2019-07-05 05:05:14 94 87 18902 0 53
575 1562274340002 8 2019-07-05 05:05:40 2019-07-05 05:07:16 96 88 18902 0 53
576 1562274460003 8 2019-07-05 05:07:40 2019-07-05 05:09:13 93 85 18902 0 55
577 1562274580002 8 2019-07-05 05:09:40 2019-07-05 05:11:10 90 83 18902 0 55
578 1562274700002 8 2019-07-05 05:11:40 2019-07-05 05:13:09 89 81 18902 0 69
579 1562274820003 8 2019-07-05 05:13:40 2019-07-05 05:15:07 87 79 18902 0 57
580 1562274940003 8 2019-07-05 05:15:40 2019-07-05 05:17:08 88 81 18902 0 63
581 1562275060002 8 2019-07-05 05:17:40 2019-07-05 05:19:02 82 75 18902 0 58
582 1562275180002 8 2019-07-05 05:19:40 2019-07-05 05:21:05 85 78 18902 0 51
583 1562275300003 8 2019-07-05 05:21:40 2019-07-05 05:23:06 86 78 18902 0 49
584 1562275420003 8 2019-07-05 05:23:40 2019-07-05 05:25:11 91 84 18902 0 49
585 1562275540003 8 2019-07-05 05:25:40 2019-07-05 05:27:09 89 81 18902 0 53
586 1562275660003 8 2019-07-05 05:27:40 2019-07-05 05:29:11 91 83 18902 0 64
587 1562275780003 8 2019-07-05 05:29:40 2019-07-05 05:31:11 91 83 18902 0 60
588 1562275900002 8 2019-07-05 05:31:40 2019-07-05 05:33:10 90 83 18902 0 52
589 1562276020003 8 2019-07-05 05:33:40 2019-07-05 05:35:09 89 82 18902 0 54
590 1562276140002 8 2019-07-05 05:35:40 2019-07-05 05:37:10 90 83 18902 0 53
591 1562276260003 8 2019-07-05 05:37:40 2019-07-05 05:39:10 90 82 18902 0 74
592 1562276380002 8 2019-07-05 05:39:40 2019-07-05 05:41:10 90 83 18902 0 54
593 1562276500002 8 2019-07-05 05:41:40 2019-07-05 05:43:10 90 83 18902 0 63
594 1562276620003 8 2019-07-05 05:43:40 2019-07-05 05:45:04 84 77 18902 0 68
595 1562276740002 8 2019-07-05 05:45:40 2019-07-05 05:47:08 88 80 18902 0 82
596 1562276860003 8 2019-07-05 05:47:40 2019-07-05 05:49:09 89 82 18902 0 61
597 1562276980003 8 2019-07-05 05:49:40 2019-07-05 05:51:08 88 81 18902 0 60
598 1562277100003 8 2019-07-05 05:51:40 2019-07-05 05:53:04 84 76 18902 0 73
599 1562277220003 8 2019-07-05 05:53:40 2019-07-05 05:55:06 86 79 18902 0 64
600 1562277340002 8 2019-07-05 05:55:40 2019-07-05 05:57:08 88 81 18902 0 79
601 1562277460003 8 2019-07-05 05:57:40 2019-07-05 05:59:07 87 79 18902 0 77
602 1562277580003 8 2019-07-05 05:59:40 2019-07-05 06:01:07 87 79 18902 0 74
603 1562277700003 8 2019-07-05 06:01:40 2019-07-05 06:03:10 90 83 18902 0 74
604 1562277820003 8 2019-07-05 06:03:40 2019-07-05 06:05:10 90 82 18902 0 75
605 1562277940003 8 2019-07-05 06:05:40 2019-07-05 06:07:10 90 82 18902 0 80
606 1562278060002 8 2019-07-05 06:07:40 2019-07-05 06:09:10 90 82 18902 0 73
607 1562278180002 8 2019-07-05 06:09:40 2019-07-05 06:11:04 84 77 18902 0 70
608 1562278300003 8 2019-07-05 06:11:40 2019-07-05 06:13:04 84 76 18902 0 80
609 1562278420002 8 2019-07-05 06:13:40 2019-07-05 06:15:07 87 80 18902 0 97
610 1562278540003 8 2019-07-05 06:15:40 2019-07-05 06:17:09 89 80 18902 0 103
611 1562278660003 8 2019-07-05 06:17:40 2019-07-05 06:19:07 87 79 18902 0 104
612 1562278780003 8 2019-07-05 06:19:40 2019-07-05 06:21:06 86 78 18902 0 65
613 1562278900003 8 2019-07-05 06:21:40 2019-07-05 06:23:13 93 85 18902 0 76
614 1562279020003 8 2019-07-05 06:23:40 2019-07-05 06:25:15 95 86 18902 0 88
615 1562279140003 8 2019-07-05 06:25:40 2019-07-05 06:27:15 95 87 18902 0 101
616 1562279260003 8 2019-07-05 06:27:40 2019-07-05 06:29:14 94 87 18902 0 75
617 1562279380002 8 2019-07-05 06:29:40 2019-07-05 06:31:14 94 86 18902 0 97
618 1562279500003 8 2019-07-05 06:31:40 2019-07-05 06:33:15 95 86 18902 0 97
619 1562279620003 8 2019-07-05 06:33:40 2019-07-05 06:35:11 91 83 18902 0 90
620 1562279740003 8 2019-07-05 06:35:40 2019-07-05 06:37:07 87 78 18902 0 95
621 1562279860003 8 2019-07-05 06:37:40 2019-07-05 06:39:05 85 76 18902 0 86
622 1562279980003 8 2019-07-05 06:39:40 2019-07-05 06:41:12 92 84 18902 0 91
623 1562280100002 8 2019-07-05 06:41:40 2019-07-05 06:43:11 91 83 18902 0 94
624 1562280220002 8 2019-07-05 06:43:40 2019-07-05 06:45:12 92 83 18902 0 91
625 1562280340003 8 2019-07-05 06:45:40 2019-07-05 06:47:11 91 83 18902 0 88
626 1562280460002 8 2019-07-05 06:47:40 2019-07-05 06:49:12 92 83 18902 0 121
627 1562280580003 8 2019-07-05 06:49:40 2019-07-05 06:51:11 91 83 18902 0 97
628 1562280700002 8 2019-07-05 06:51:40 2019-07-05 06:53:10 90 82 18902 0 76
629 1562280820003 8 2019-07-05 06:53:40 2019-07-05 06:55:10 90 82 18902 0 98
630 1562280940002 8 2019-07-05 06:55:40 2019-07-05 06:57:15 95 87 18902 0 114
631 1562281060003 8 2019-07-05 06:57:40 2019-07-05 06:59:15 95 87 18902 0 106
632 1562281180002 8 2019-07-05 06:59:40 2019-07-05 07:01:16 96 88 18902 0 116
633 1562281300003 8 2019-07-05 07:01:40 2019-07-05 07:03:14 94 85 18902 0 123
634 1562281420002 8 2019-07-05 07:03:40 2019-07-05 07:05:08 88 79 18902 0 126
635 1562281540003 8 2019-07-05 07:05:40 2019-07-05 07:07:09 89 80 18902 0 121
636 1562281660002 8 2019-07-05 07:07:40 2019-07-05 07:09:14 94 85 18902 0 137
637 1562281780003 8 2019-07-05 07:09:40 2019-07-05 07:11:13 93 83 18902 0 156
638 1562281900002 8 2019-07-05 07:11:40 2019-07-05 07:13:11 91 80 18902 0 141
639 1562282020003 8 2019-07-05 07:13:40 2019-07-05 07:15:10 90 80 18902 0 167
640 1562282140003 8 2019-07-05 07:15:40 2019-07-05 07:17:13 93 81 18902 0 189
641 1562282260003 8 2019-07-05 07:17:40 2019-07-05 07:19:12 92 80 18902 0 183
642 1562282380003 8 2019-07-05 07:19:40 2019-07-05 07:21:15 95 84 18902 0 182
643 1562282500002 8 2019-07-05 07:21:40 2019-07-05 07:23:15 95 84 18902 0 198
644 1562282620003 8 2019-07-05 07:23:40 2019-07-05 07:25:12 92 79 18902 0 208
645 1562282740002 8 2019-07-05 07:25:40 2019-07-05 07:27:09 89 77 18902 0 227
646 1562282860003 8 2019-07-05 07:27:40 2019-07-05 07:29:15 95 81 18902 0 249
647 1562282980003 8 2019-07-05 07:29:40 2019-07-05 07:31:17 97 83 18902 0 273
648 1562283100003 8 2019-07-05 07:31:40 2019-07-05 07:33:17 97 81 18902 0 287
649 1562283220002 8 2019-07-05 07:33:40 2019-07-05 07:35:14 94 77 18902 0 297
650 1562283340003 8 2019-07-05 07:35:40 2019-07-05 07:37:17 97 80 18902 0 311
651 1562283460002 8 2019-07-05 07:37:40 2019-07-05 07:39:22 102 84 18902 0 329
652 1562283580003 8 2019-07-05 07:39:40 2019-07-05 07:41:16 96 79 18902 0 319
653 1562283700002 8 2019-07-05 07:41:40 2019-07-05 07:43:17 97 80 18902 0 306
654 1562283820003 8 2019-07-05 07:43:40 2019-07-05 07:45:19 99 81 18902 0 348
655 1562283940002 8 2019-07-05 07:45:40 2019-07-05 07:47:19 99 80 18902 0 359
656 1562284060003 8 2019-07-05 07:47:40 2019-07-05 07:49:16 96 78 18902 0 363
657 1562284180002 8 2019-07-05 07:49:40 2019-07-05 07:51:17 97 79 18902 0 380
658 1562284300002 8 2019-07-05 07:51:40 2019-07-05 07:53:22 102 82 18902 0 381
659 1562284420003 8 2019-07-05 07:53:40 2019-07-05 07:55:20 100 80 18902 0 400
660 1562284540002 8 2019-07-05 07:55:40 2019-07-05 07:57:15 95 77 18902 0 383
661 1562284660002 8 2019-07-05 07:57:40 2019-07-05 07:59:19 99 80 18902 0 396
662 1562284780003 8 2019-07-05 07:59:40 2019-07-05 08:01:25 105 86 18902 0 378
663 1562284900002 8 2019-07-05 08:01:40 2019-07-05 08:03:23 103 82 18902 0 390
664 1562285020002 8 2019-07-05 08:03:40 2019-07-05 08:05:23 103 82 18902 0 385
665 1562285140002 8 2019-07-05 08:05:40 2019-07-05 08:07:22 102 82 18902 0 395
666 1562285260003 8 2019-07-05 08:07:40 2019-07-05 08:09:20 100 78 18902 0 415
667 1562285380002 8 2019-07-05 08:09:40 2019-07-05 08:11:21 101 80 18902 0 411
668 1562285500002 8 2019-07-05 08:11:40 2019-07-05 08:13:24 104 84 18902 0 398
669 1562285620003 8 2019-07-05 08:13:40 2019-07-05 08:15:24 104 83 18902 0 390
670 1562285740002 8 2019-07-05 08:15:40 2019-07-05 08:17:24 104 82 18901 1 396
671 1562285860003 8 2019-07-05 08:17:40 2019-07-05 08:19:25 105 82 18902 0 393
672 1562285980002 8 2019-07-05 08:19:40 2019-07-05 08:21:23 103 78 18902 0 440
673 1562286100002 8 2019-07-05 08:21:40 2019-07-05 08:23:29 109 87 18902 0 426
674 1562286220002 8 2019-07-05 08:23:40 2019-07-05 08:25:29 109 87 18902 0 425
675 1562286340002 8 2019-07-05 08:25:40 2019-07-05 08:27:28 108 87 18902 0 419
676 1562286460003 8 2019-07-05 08:27:40 2019-07-05 08:29:27 107 83 18902 0 412
677 1562286580003 8 2019-07-05 08:29:40 2019-07-05 08:31:22 102 81 18902 0 410
678 1562286700003 8 2019-07-05 08:31:40 2019-07-05 08:33:20 100 79 18902 0 406
679 1562286820003 8 2019-07-05 08:33:40 2019-07-05 08:35:34 114 90 18900 2 410
680 1562286940003 8 2019-07-05 08:35:40 2019-07-05 08:37:24 104 82 18902 0 370
681 1562287060003 8 2019-07-05 08:37:40 2019-07-05 08:39:24 104 83 18902 0 369
682 1562287180002 8 2019-07-05 08:39:40 2019-07-05 08:41:28 108 88 18902 0 386
683 1562287300003 8 2019-07-05 08:41:40 2019-07-05 08:43:27 107 88 18902 0 368
684 1562287420002 8 2019-07-05 08:43:40 2019-07-05 08:45:25 105 86 18902 0 376
685 1562287540002 8 2019-07-05 08:45:40 2019-07-05 08:47:24 104 84 18902 0 379
686 1562287660003 8 2019-07-05 08:47:40 2019-07-05 08:49:22 102 82 18902 0 363
687 1562287780003 8 2019-07-05 08:49:40 2019-07-05 08:51:26 106 85 18902 0 365
688 1562287900003 8 2019-07-05 08:51:40 2019-07-05 08:53:23 103 84 18902 0 377
689 1562288020002 8 2019-07-05 08:53:40 2019-07-05 08:55:21 101 82 18902 0 367
690 1562288140003 8 2019-07-05 08:55:40 2019-07-05 08:57:20 100 82 18902 0 351
691 1562288260003 8 2019-07-05 08:57:40 2019-07-05 08:59:21 101 82 18902 0 321
692 1562288380003 8 2019-07-05 08:59:40 2019-07-05 09:01:18 98 81 18902 0 330
693 1562288500002 8 2019-07-05 09:01:40 2019-07-05 09:03:18 98 82 18902 0 309
694 1562288620003 8 2019-07-05 09:03:40 2019-07-05 09:05:22 102 85 18902 0 310
695 1562288740003 8 2019-07-05 09:05:40 2019-07-05 09:07:19 99 83 18902 0 309
696 1562288860002 8 2019-07-05 09:07:40 2019-07-05 09:09:19 99 81 18902 0 326
697 1562288980003 8 2019-07-05 09:09:40 2019-07-05 09:11:13 93 77 18902 0 312
698 1562289100002 8 2019-07-05 09:11:40 2019-07-05 09:13:13 93 78 18902 0 299
699 1562289220003 8 2019-07-05 09:13:40 2019-07-05 09:15:20 100 84 18902 0 298
700 1562289340003 8 2019-07-05 09:15:40 2019-07-05 09:17:44 124 107 18900 2 262
701 1562289480003 8 2019-07-05 09:18:00 2019-07-05 09:21:22 202 172 18900 2 311
702 1562289700003 8 2019-07-05 09:21:40 2019-07-05 09:23:38 118 102 18902 0 321
703 1562289820003 8 2019-07-05 09:23:40 2019-07-05 09:26:13 153 124 18900 2 326
704 1562290000003 8 2019-07-05 09:26:40 2019-07-05 09:29:12 152 129 18902 0 333
705 1562290180003 8 2019-07-05 09:29:40 2019-07-05 09:32:59 199 178 18900 2 322
706 1562290380003 8 2019-07-05 09:33:00 2019-07-05 09:36:27 207 162 18897 5 315
707 1562290600003 8 2019-07-05 09:36:40 2019-07-05 09:41:17 277 238 18896 6 306
708 1562290900002 8 2019-07-05 09:41:40 2019-07-05 09:45:31 231 201 18899 3 336
709 1562291140003 8 2019-07-05 09:45:40 2019-07-05 09:47:49 129 111 18902 0 341
710 1562291280002 8 2019-07-05 09:48:00 2019-07-05 09:49:40 100 83 18902 0 325
711 1562291400002 8 2019-07-05 09:50:00 2019-07-05 09:51:38 98 81 18902 0 314
712 1562291500002 8 2019-07-05 09:51:40 2019-07-05 09:53:19 99 83 18902 0 297
713 1562291620002 8 2019-07-05 09:53:40 2019-07-05 09:55:22 102 85 18902 0 317
714 1562291740003 8 2019-07-05 09:55:40 2019-07-05 09:57:26 106 89 18901 1 293
715 1562291860003 8 2019-07-05 09:57:40 2019-07-05 09:59:27 107 91 18902 0 313
716 1562291980002 8 2019-07-05 09:59:40 2019-07-05 10:01:25 105 88 18902 0 319
717 1562292100003 8 2019-07-05 10:01:40 2019-07-05 10:03:22 102 84 18901 1 297
718 1562292220002 8 2019-07-05 10:03:40 2019-07-05 10:05:25 105 87 18900 2 290
719 1562292340002 8 2019-07-05 10:05:40 2019-07-05 10:07:16 96 81 18902 0 292
720 1562292460002 8 2019-07-05 10:07:40 2019-07-05 10:09:23 103 88 18902 0 270
721 1562292580003 8 2019-07-05 10:09:40 2019-07-05 10:11:29 109 93 18902 0 288
722 1562292700003 8 2019-07-05 10:11:40 2019-07-05 10:13:24 104 87 18901 1 289
723 1562292820003 8 2019-07-05 10:13:40 2019-07-05 10:15:32 112 94 18899 3 299
724 1562292940002 8 2019-07-05 10:15:40 2019-07-05 10:17:16 96 79 18902 0 287
725 1562293060002 8 2019-07-05 10:17:40 2019-07-05 10:19:17 97 82 18902 0 301
726 1562293180002 8 2019-07-05 10:19:40 2019-07-05 10:21:48 128 101 18901 1 283
727 1562293320002 8 2019-07-05 10:22:00 2019-07-05 10:23:46 106 90 18902 0 314
728 1562293440003 8 2019-07-05 10:24:00 2019-07-05 10:25:43 103 87 18902 0 299
729 1562293560003 8 2019-07-05 10:26:00 2019-07-05 10:27:38 98 82 18902 0 301
730 1562293660003 8 2019-07-05 10:27:40 2019-07-05 10:29:24 104 87 18902 0 295
731 1562293780002 8 2019-07-05 10:29:40 2019-07-05 10:31:21 101 85 18902 0 269
732 1562293900003 8 2019-07-05 10:31:40 2019-07-05 10:33:21 101 87 18902 0 266
733 1562294020002 8 2019-07-05 10:33:40 2019-07-05 10:35:17 97 81 18902 0 267
734 1562294140002 8 2019-07-05 10:35:40 2019-07-05 10:37:15 95 82 18902 0 254
735 1562294260002 8 2019-07-05 10:37:40 2019-07-05 10:39:20 100 87 18902 0 235
736 1562294380003 8 2019-07-05 10:39:40 2019-07-05 10:41:18 98 82 18902 0 252
737 1562294500003 8 2019-07-05 10:41:40 2019-07-05 10:43:23 103 87 18902 0 265
738 1562294620002 8 2019-07-05 10:43:40 2019-07-05 10:45:30 110 94 18902 0 274
739 1562294740002 8 2019-07-05 10:45:40 2019-07-05 10:47:23 103 87 18902 0 260
740 1562294860003 8 2019-07-05 10:47:40 2019-07-05 10:49:22 102 85 18902 0 271
741 1562294980002 8 2019-07-05 10:49:40 2019-07-05 10:51:25 105 90 18902 0 268
742 1562295100002 8 2019-07-05 10:51:40 2019-07-05 10:53:23 103 88 18902 0 286
743 1562295220003 8 2019-07-05 10:53:40 2019-07-05 10:55:25 105 88 18902 0 258
744 1562295340003 8 2019-07-05 10:55:40 2019-07-05 10:57:54 134 117 18901 1 252
745 1562295480002 8 2019-07-05 10:58:00 2019-07-05 10:59:55 115 98 18902 0 266
746 1562295600002 8 2019-07-05 11:00:00 2019-07-05 11:01:44 104 87 18902 0 265
747 1562295720002 8 2019-07-05 11:02:00 2019-07-05 11:03:49 109 94 18902 0 267
748 1562295840003 8 2019-07-05 11:04:00 2019-07-05 11:05:45 105 86 18901 1 267
749 1562295960002 8 2019-07-05 11:06:00 2019-07-05 11:07:46 106 91 18902 0 251
750 1562296080002 8 2019-07-05 11:08:00 2019-07-05 11:09:41 101 85 18901 1 250
751 1562296200002 8 2019-07-05 11:10:00 2019-07-05 11:11:48 108 91 18901 1 264
752 1562296320003 8 2019-07-05 11:12:00 2019-07-05 11:13:41 101 86 18902 0 270
753 1562296440003 8 2019-07-05 11:14:00 2019-07-05 11:15:45 105 90 18902 0 272
754 1562296560003 8 2019-07-05 11:16:00 2019-07-05 11:17:42 102 88 18901 1 273
755 1562296680003 8 2019-07-05 11:18:00 2019-07-05 11:19:40 100 86 18902 0 279
756 1562296800002 8 2019-07-05 11:20:00 2019-07-05 11:21:44 104 91 18902 0 252
757 1562296920002 8 2019-07-05 11:22:00 2019-07-05 11:23:50 110 95 18902 0 265
758 1562297040003 8 2019-07-05 11:24:00 2019-07-05 11:25:40 100 86 18902 0 257
759 1562297160003 8 2019-07-05 11:26:00 2019-07-05 11:27:41 101 87 18902 0 265
760 1562297280002 8 2019-07-05 11:28:00 2019-07-05 11:29:47 107 93 18902 0 260
761 1562297400002 8 2019-07-05 11:30:00 2019-07-05 11:31:45 105 92 18902 0 235
762 1562297520002 8 2019-07-05 11:32:00 2019-07-05 11:33:38 98 87 18902 0 197
763 1562297620002 8 2019-07-05 11:33:40 2019-07-05 11:35:26 106 94 18902 0 209
764 1562297740002 8 2019-07-05 11:35:40 2019-07-05 11:37:21 101 88 18902 0 212
765 1562297860003 8 2019-07-05 11:37:40 2019-07-05 11:39:19 99 84 18902 0 224
766 1562297980003 8 2019-07-05 11:39:40 2019-07-05 11:41:13 93 80 18902 0 220
767 1562298100002 8 2019-07-05 11:41:40 2019-07-05 11:43:37 117 102 18901 1 215
768 1562298220003 8 2019-07-05 11:43:40 2019-07-05 11:45:27 107 95 18902 0 217
769 1562298340003 8 2019-07-05 11:45:40 2019-07-05 11:47:31 111 98 18902 0 209
770 1562298460002 8 2019-07-05 11:47:40 2019-07-05 11:49:21 101 89 18902 0 221
771 1562298580002 8 2019-07-05 11:49:40 2019-07-05 11:51:18 97 85 18902 0 231
772 1562298700002 8 2019-07-05 11:51:40 2019-07-05 11:53:23 103 92 18902 0 232
773 1562298820002 8 2019-07-05 11:53:40 2019-07-05 11:55:20 100 89 18902 0 220
774 1562298940003 8 2019-07-05 11:55:40 2019-07-05 11:57:24 104 90 18900 2 225
775 1562299060002 8 2019-07-05 11:57:40 2019-07-05 11:59:57 137 121 18899 3 233
776 1562299200005 8 2019-07-05 12:00:00 2019-07-05 12:01:41 101 85 18901 1 207
777 1562299320002 8 2019-07-05 12:02:00 2019-07-05 12:03:37 97 86 18902 0 203
778 1562299420003 8 2019-07-05 12:03:40 2019-07-05 12:05:18 98 88 18902 0 193
779 1562299540003 8 2019-07-05 12:05:40 2019-07-05 12:07:17 97 83 18902 0 197
780 1562299660003 8 2019-07-05 12:07:40 2019-07-05 12:09:10 90 77 18902 0 196
781 1562299780002 8 2019-07-05 12:09:40 2019-07-05 12:11:10 90 78 18902 0 211
782 1562299900002 8 2019-07-05 12:11:40 2019-07-05 12:13:19 99 86 18901 1 203
783 1562300020002 8 2019-07-05 12:13:40 2019-07-05 12:15:17 97 86 18902 0 190
784 1562300140002 8 2019-07-05 12:15:40 2019-07-05 12:17:18 98 87 18902 0 187
785 1562300260003 8 2019-07-05 12:17:40 2019-07-05 12:19:20 100 89 18902 0 183
786 1562300380002 8 2019-07-05 12:19:40 2019-07-05 12:21:25 105 95 18902 0 183
787 1562300500010 8 2019-07-05 12:21:40 2019-07-05 12:23:19 99 87 18901 1 172
788 1562300620004 8 2019-07-05 12:23:40 2019-07-05 12:25:13 93 82 18902 0 184
789 1562300740004 8 2019-07-05 12:25:40 2019-07-05 12:27:20 100 89 18902 0 190
790 1562300860003 8 2019-07-05 12:27:40 2019-07-05 12:29:20 100 89 18902 0 171
791 1562300980004 8 2019-07-05 12:29:40 2019-07-05 12:31:25 105 94 18902 0 169
792 1562301100003 8 2019-07-05 12:31:40 2019-07-05 12:33:19 99 88 18902 0 182
793 1562301220004 8 2019-07-05 12:33:40 2019-07-05 12:35:16 96 86 18902 0 172
794 1562301340003 8 2019-07-05 12:35:40 2019-07-05 12:37:21 101 89 18902 0 164
795 1562301460004 8 2019-07-05 12:37:40 2019-07-05 12:39:17 97 85 18902 0 158
796 1562301580003 8 2019-07-05 12:39:40 2019-07-05 12:41:25 105 93 18902 0 184
797 1562301700005 8 2019-07-05 12:41:40 2019-07-05 12:43:19 99 88 18902 0 173
798 1562301820004 8 2019-07-05 12:43:40 2019-07-05 12:45:14 94 84 18902 0 155
799 1562301940004 8 2019-07-05 12:45:40 2019-07-05 12:47:20 100 88 18902 0 158
800 1562302060004 8 2019-07-05 12:47:40 2019-07-05 12:49:18 98 88 18902 0 146
801 1562302180003 8 2019-07-05 12:49:40 2019-07-05 12:51:26 106 93 18902 0 165
802 1562302300003 8 2019-07-05 12:51:40 2019-07-05 12:53:23 103 92 18902 0 172
803 1562302420004 8 2019-07-05 12:53:40 2019-07-05 12:55:29 109 96 18902 0 183
804 1562302540005 8 2019-07-05 12:55:40 2019-07-05 12:57:26 106 95 18902 0 140
805 1562302660004 8 2019-07-05 12:57:40 2019-07-05 12:59:20 100 89 18902 0 143
806 1562302780004 8 2019-07-05 12:59:40 2019-07-05 13:01:21 101 89 18902 0 145
807 1562302900004 8 2019-07-05 13:01:40 2019-07-05 13:03:25 105 94 18902 0 155
808 1562303020005 8 2019-07-05 13:03:40 2019-07-05 13:05:18 98 86 18902 0 164
809 1562303140004 8 2019-07-05 13:05:40 2019-07-05 13:07:19 99 89 18902 0 176
810 1562303260007 8 2019-07-05 13:07:40 2019-07-05 13:09:22 102 91 18902 0 153
811 1562303380006 8 2019-07-05 13:09:40 2019-07-05 13:11:21 101 91 18902 0 166
812 1562303500005 8 2019-07-05 13:11:40 2019-07-05 13:13:18 98 85 18901 1 151

完整数据

完整数据可通过连接数据库查看:

DBType: MariaDB
schemas: traffic-service-v2
host: 192.168.10.224
port: 3306
username: root
password: 123456

数据分析

通过以上数据,我们可以做个简单汇总分析:

  1. 一个分析周期内网络请求所消耗的时间占用了总消耗时间的 4/5, 这里说的网络请求时间指的是请求百度瓦片所消耗的时间
  2. 一个分析周期内: 总消耗时间的平均值为: 98.7 s, 网络请求所消耗的平均时间为: 85.7 s, 服务处理所消耗的平均时间为 13 s ;至于时间为什么会呈这样的分布,下面会有详细的解释
  3. 7 月 4 日的晚高峰拥堵时间开始与 17:09 左右, 于 19:33 左右结束, 并且在 17:58 至 18:00 达到了最高峰; 在最高峰时间服务分析耗时 31 s, 处理了 613 张拥堵瓦片.同理,还可以对 7 月 5 日进行同样的分析,这里不再列举
  4. 单张瓦片平均处理时间为 : 0.06976290 s
  5. 每个分析周期都会请求 18902 次瓦片,为什么有的周期请求时间断,而有的周期请求时间长?
    原因有 2 :
    1. 请求过程中可能会发生阻塞的情况,虽然这种情况较少,但是会拖慢单个线程的处理速度
    2. 每次分析的拥堵状况不同, 涉及拥堵的瓦片被填充的有效像素点的数量也不同,这就导致每次同一编号瓦片,但是大小不同,消耗的时间也就不同

机器表现

经过一周的服务性能测试,机器的表现如下

  1. CPU

CPU-OVERVIEW

这是一个分析周期的资源占用情况, 一个分析周期指的是分析完一遍合肥市拥堵情况的动作
截取其中几分钟的的监控情况如下:

CPU

简单解释:
第二张图中每个驼峰代表一次分析过程,图中 11:06 - 11:13,经过了 4 个分析周期,每个分析周期的的大致状态是前期和后期 CPU 占用率都不高,中间部分 CPU 占有率高, 约 80% 左右
这是因为在抓取地图瓦片的时候是按 从北向南 , 从西向东 的顺序来抓取的
很显然合肥市市内是较整个合肥市拥堵情况较重的,而市内是则位于整片区域的中心部分
于是就能解释为什么在一个分析周期前期和后期 CPU 占用率都不高,中间部分 CPU 占有率高的原因

  1. 线程
    Thread

简单解释:
重点看 ts_ 前缀开头的线程
这 8 条线代表分析服务的 8 个线程,绿色代表正在运行, 黄色代表在等待中
中间被隔开代表分析服务已经进行了一个周期
可以看出单个线程在执行一个分析周期的时候,有至少三分之一的时间是处于等待的
这是因为服务分析速度很快,分析完毕之后就从队列中拿出下一条任务出来分析,而在分析之前,会先进行网络请求
请求瓦片是 TCP 请求, 经历上一次请求关闭的四次挥手和连接建立的三次握手, 这种 IO 请求的耗时对 CPU 来说简直如隔三秋
( 对于一次分析周期,去除无道路信息的瓦片,有 18902 张瓦片, 这些都是几十 KB 到几百 KB 大小不等的图片, 需要进行 18902 次 IO 请求,其开销必然不小 )
但是 CPU 不会闲着,他会去处理其他线程的请求
这样的分析也能够解释了上述表格中 总耗时网络请求耗时 之间的关系

线程中甚至还会出现这样的情况

Thread Waiting

这种情况会拖慢单个线程的执行效率
这种情况是因为在请求百度瓦片的时候某一张耗时过长被阻塞了,导致线程一直在等待,直到等待时间大于等于连接超时时间或者数据传输超时时间,该线程会被主动释放,后面又恢复正常运行
不过这种情况出现的次数比较少,主要看网络的稳定性,有出现的情况都在日志里记录下来了,即上述表格中的出错数

  1. 内存
    Memory

对于服务器内存来说, 24G 内存还是比较吃紧的
其中最消耗服务器内存是核心分析服务, 为 java 服务
java 12 初始化堆大小和最大堆大小均没有配置,为缺省值
这时最大堆大小 Xmx 为物理内存的 1/4 , 即 6 GB

通过上面的图可以得出:
核心分析服务达到峰值时, 以达到最大内存 6G, 后来内存占用又会减少,很有可能是 6G 内存不够使用,已触发 GC, 导致内存释放
结合整个机器内存占用普遍在 80% 以上, 更能说明这一点

  1. 磁盘
    Disk

磁盘的 IO 情况其实并没有太大变动,只是在分析的高峰会有写入和读取

  1. 网络
    Networks

8 线程并发请求, 外网下载速度平稳在 350 kb/s 左右, 对网络带宽大小要求不高,但要求网络稳定,无抖动,无丢包

性能优化

经过上面的分析,我认为可以从下面几个点再继续优化:

  1. 提示机器内存: 显然测试机器的内存有点吃紧, 至少 64 G 为合适
  2. CPU 的频率不需要太高,可选择核数多 CPU, 因为整个耗时最长的是网络请求时间, 而这种 IO 并不消耗 CPU 时间,可将线程数调节至 CPU 逻辑核心数的 3 倍到 5 倍. 推荐 IntelXeon E5 系列 CPU
  3. 提供更稳定的网络
  4. 既然请求百度的瓦片耗时高,那么先缓存一部分瓦片到本地进行分析,效率是否更高? (下面进行测试) 不过带来的坏处就是丧失了分析服务的实时性

本地缓存分析

我事先缓存了 2019年07月04日17:00:00 到 2019年07月04日18:00:00, 60 分钟内每分钟的瓦片数据, 共计 18902 * 60 = 1134120 张瓦片到本地磁盘

Nginx 读取

将这 110w 张瓦片放到 nginx 目录下, 在进行测试
发现测试结果并不能够令人满意,和上面的结果几乎无差,这里就不再贴出表格数据了
仔细分析结果是没错的.还是同样的 TCP 请求,只不过不同的是从远端服务器变成了本地服务器

本地读取瓦片

将 TCP 请求更换为本地读取文件形式,结果分析时间令人欣慰, 这里也不贴出表格数据了,放一张日志的截图对比下

File System

总结

  1. 本分析服务对服务器的要求并不高, 要求 CPU 尽量多核心,网络稳定
  2. 开销时间主要集中在网络请求耗时, 目前较好的解决方式是先本地缓存再分析,牺牲了分析的实时性
0%