一.解决方法
/**
* 注入 securityManager
*/
@Bean
public SecurityManager securityManager(@Qualifier("myShiroRealm") ShiroDbRealm myShiroRealm,@Qualifier("webSessionManager") DefaultWebSessionManager sessionManager) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 设置自定义 realm.
securityManager.setRealm(myShiroRealm);
securityManager.setSessionManager(sessionManager);
/*
* 关闭shiro自带的session,详情见文档
* http://shiro.apache.org/session-management.html#SessionManagement-StatelessApplications%28Sessionless%29
*/
DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO();
DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator();
defaultSessionStorageEvaluator.setSessionStorageEnabled(false);
subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator);
securityManager.setSubjectDAO(subjectDAO);
return securityManager;
}
/**
* 解决shiro的URL中出现sessionID的情况
* EG: localhost:8080/toLogin;jsessionid=D5C1EE61B97EE2D7098F58A837B82BD4
* https://blog.csdn.net/java_cpp_/article/details/124256865
* @return
*/
@Bean
@Qualifier("webSessionManager")
public DefaultWebSessionManager sessionManager() {
DefaultWebSessionManager defaultWebSessionManager = new DefaultWebSessionManager();
defaultWebSessionManager.setSessionIdUrlRewritingEnabled(false);
return defaultWebSessionManager;
}
二.复现场景
项目中用到一个免密登录的场景,该场景为,根据传递过来的用户名密码以及指定的url登录沿海新增成功后进行跳转,跳转过程中重定向到index路径中,然而出现了下面的场景:
即URL中莫名出现了一个jsessionid,链接跳转变成了400,导致重定向失败。
仔细观察上一个链接,即免密登录链接会发现在Location中存在此链接了,也有对用的jsessionid。
所以想办法解决掉这个jsessionid即可,即为步骤一的操作。
三.原理
1、当访问localhost:8080/,测试shiro进行拦截发现还没登录,则shiro则会在内部进行一个重定向到localhost:8080/toLogin
2、但是server服务器并不知道是shiro的重定向,重定向的请求中没有session、cookie等信息,服务器就会以为是客户端禁用了该功能,所以服务器就自动为其分配一个sessionid
3、所以响应到客户端的url就被添加上了sessionid