Spring Boot之Shiro中Session丢失问题

标签: Springboot 分类: Java 创建时间:2020-06-16 07:31:04 更新时间:2024-11-15 10:49:43

(1) 请求session不一致问题
今天发现了一个奇怪的问题,就是同一浏览器同一网页,同时发起两次请求,请求同一个login方法,第一次登录成功,理论上第二次请求调用currentUser.isAuthenticated()就应该时true,但是我的问题就是两个请求不一样,连session都不同,不知道是什么原因,所以导致了第一虽然登录成功了,但是checklogin时,返回的确是未登录。
其实无论登录不登录,其实两次请求都应该是同一个session。

这里的1、2和3都是同一个网页的连续请求,但是1的login与2和3的请求都是不一样的,不一样的后果,就是比如我调用currentUser.isAuthenticated(),返回的结果就是false,显示用户未登录。我在login方法登录成功之后,调用isAuthenticated()方法,返回的是true。

更奇怪的是,在postman中进行测试,login和logout以及checklogin都是正常的,但是就是在网页中不行。

奇怪的事接着一桩又一桩,突然之间又好了,我后台只把在shiroFilterFactoryBean这个Bean中的下面的代码注释打开了,然后不启用shiroFilterChainDefinition这个Bean罢了

1
2
3
4
5
filterChainDefinitionMap.put("/static/**","anon");
filterChainDefinitionMap.put("/user/**", "anon");
filterChainDefinitionMap.put("/api/**","authc");
filterChainDefinitionMap.put("/**", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

还有一点就是前端在请求login时要带上withCredentials: true,否则也不行。

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
$.ajax({
url:window.baseUrl+"/user/login",
type:"post",
dataType:"json",
xhrFields: {
withCredentials: true
},
data:{
username:username,
password:password
},
success:function (data) {

if(data&&data.state==2){
$(".massage").text(data.message).css("visibility","visible");
}
if(data&&data.state==1){
// location.href="./index.html"
}
$.ajax({
url:window.baseUrl+"/user/checklogin",
type:"post",
dataType:"json",
xhrFields: {
withCredentials: true
},
success:function(data){
// 未登录则跳转登录页面
console.log(data)
if(data&&data.state==2){
console.log("dfsd");
//location.href=that.urlConfig.baseUrl;
}
},
error:function(err){
console.log(err);
}
})
},
error:function (err) {
console.log(err)
}
});

总结

(1) 定义了shiroFilterFactoryBean就不用在shiroFilterChainDefinition中配置权限了,配置了也没有用,不起作用。

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
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
return chainDefinition;
}

//配置shrio拦截器
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

// 必须设置SecuritManager
shiroFilterFactoryBean.setSecurityManager(securityManager);

Map<String, Filter> filters = shiroFilterFactoryBean.getFilters();
//配置拦截器,实现无权限返回401,而不是跳转到登录页
filters.put("authc", new FormLoginFilter());
// 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
shiroFilterFactoryBean.setLoginUrl("/");
// 登录成功后要跳转的链接
shiroFilterFactoryBean.setSuccessUrl("/");
// 未授权界面;
shiroFilterFactoryBean.setUnauthorizedUrl("/403");

// 拦截器
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
// 过滤链定义,从上向下顺序执行,一般将 /**放在最为下边
// authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问
filterChainDefinitionMap.put("/static/**","anon");
filterChainDefinitionMap.put("/user/**", "anon");
filterChainDefinitionMap.put("/api/**","authc");
filterChainDefinitionMap.put("/**", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

return shiroFilterFactoryBean;
}

(2) 使用ajax,特别是jquery时,要加上请求中要加上withCredentials: true,否则后端就拿不到session。

文章目录
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。