SpringMVC+Shiro 因jsessionid导致第一次访问请求时报400错误问题
Posted 秋9
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC+Shiro 因jsessionid导致第一次访问请求时报400错误问题相关的知识,希望对你有一定的参考价值。
【现象】
HTTP Status 400 – Bad Request
Type Status Report
Message Invalid request
Description The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).
Apache Tomcat/8.5.30
截图如下:
【原因】
解决Shiro第一次重定向url带有jsessionid导致400错误
【解决方法】去掉jsessionid。
官方文档说明:
Set to true to disable support for using URL rewriting to track session IDs for clients of this Context. URL rewriting is an optional component of the servlet 2.5 specification but disabling URL rewriting will result in non-compliant behaviour since the specification requires that there must be a way to retain sessions if the client doesn't allow session cookies. If not specified, the specification compliant default value of false will be used.
方法1:
The Servlet 3.0 standard gives you two ways to disable URL session rewriting.
修改 web.xml :
<session-config>
<tracking-mode>COOKIE</tracking-mode>
</session-config>
或者你在代码里面使用
servletContext.setSessionTrackingModes(EnumSet.of(SessionTrackingMode.COOKIE));
或者
<?xml version='1.0' encoding='utf-8'?>
<Context docBase="PATH_TO_WEBAPP" path="/bbs" disableURLRewriting="true">
</Context>
方法2:
- 在Shiro的配置类中的sessionManager()方法中,将sessionIdUrlRewritingEnabled属性设置为false。该方法返回一个DefaultWebSessionManager实例。
- 将上面方法返回的实例设置为DefaultWebSecurityManager实例的sessionManager。
@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setSessionManager(sessionManager());
securityManager.setRealm(myShiroRealm());
//将cookie管理器交给SecurityManager进行管理
securityManager.setRememberMeManager(rememberMeManager());
return securityManager;
}@Bean
public DefaultWebSessionManager sessionManager() {
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
sessionManager.setSessionIdUrlRewritingEnabled(false);
return sessionManager;
}
方法3:
properties 文件中加入
#server.servlet.session.tracking-modes=cookie
#server.servlet.session.cookie.http-only=true
方法4:
修改springmvc源码
修改Spring MVC的代码,将:
response.sendRedirect(response.encodeRedirectURL(url));
改为:
response.sendRedirect(url);
如果还没有解决,欢迎留言。
以上是关于SpringMVC+Shiro 因jsessionid导致第一次访问请求时报400错误问题的主要内容,如果未能解决你的问题,请参考以下文章