(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){ } $.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"); } }, 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; }
@Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
Map<String, Filter> filters = shiroFilterFactoryBean.getFilters(); filters.put("authc", new FormLoginFilter()); shiroFilterFactoryBean.setLoginUrl("/"); shiroFilterFactoryBean.setSuccessUrl("/"); shiroFilterFactoryBean.setUnauthorizedUrl("/403");
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>(); 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。