当我发布Spring Boot应用程序的登录凭据时,会出现以下异常。
org.springframework.security请求被拒绝,因为URL包含潜在的恶意字符串";"
它将发布到/dologin
,然后重定向到/home
,末尾附加了jesssionid
。它也设置了会话cookie。我没有更改任何会话设置,application.properties
中也没有提到session
。
我试图设置
server.servlet.session.cookie.http-only=true
server.servlet.session.tracking-modes=cookie
如https://stackoverflow.com/a/31792535/148844所述,但没有奏效。
我加了
@Bean
public ServletContextInitializer servletContextInitializer() {
return new ServletContextInitializer() {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.setSessionTrackingModes(Collections.singleton(SessionTrackingMode.COOKIE));
SessionCookieConfig sessionCookieConfig=servletContext.getSessionCookieConfig();
sessionCookieConfig.setHttpOnly(true);
}
};
}
但是现在它只是发布、设置cookie并重定向回登录屏幕。就好像它无法访问会话一样。
我设置了server. session.tracking-mode=cookie
(而不是server.servlet…
),它现在只使用cookie,但是Chrome浏览器在登录后不会将cookie发送回服务器!/home
操作只会在会话中的user
属性为空时重新显示登录页面。
POST /dologin HTTP/1.1
Host: localhost:8080
Origin: http://localhost:8080
Upgrade-Insecure-Requests: 1
Referer: http://localhost:8080/home
HTTP/1.1 302
Set-Cookie: JSESSIONID=3B82AAA40CE94FF490FBF7B4DBD837DD; Path=/; HttpOnly
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Location: http://localhost:8080/home
GET /home HTTP/1.1
Host: localhost:8080
Upgrade-Insecure-Requests: 1
Referer: http://localhost:8080/home
HTTP/1.1 200
Set-Cookie: JSESSIONID=B60BF649068F7E85346691FD2F5D119B; Path=/; HttpOnly
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: text/html;charset=UTF-8
Content-Language: en-US
Content-Length: 2742
Date: Sat, 29 Sep 2018 17:41:55 GMT
请注意cookie是不同的,Chrome没有将cookie发送回服务器?为什么?
Spring Boot 1.5.13,Chrome版本69.0.3497.100(正式版本)(64位)
好的,将server. servlet.session.cookies.http-only=true
更改为server.session.tracking-mode=cookie
并将http://localhost:8080
更改为http://127.0.0.1:8080/
有效。我找到了这个答案:
Chrome未设置localhostcookie
似乎Chrome一直在从允许localhost
转向不允许localhost
。大约一三个月前它还在工作。localhost正在为Rails应用程序工作,Chrome正在发送cookie。
事实上,Chrome还向Spring Boot应用程序发送了用于localhost的
_mt_rails_session
Rails cookie,但从未发送过JSESSIONID
cookie。
我怀疑,但尚未确认,这可能是由于在端口8080上为不相关的第三个Spring Boot应用程序设置了HTTPS,并且可能在Chrome内部缓存了一些HSTS设置。这可能是Chrome的bug。