shiro框架使用中踩得坑,总结一下加深印象
首先,说明运行环境,前后端分离,跨域。
先说一下跨域,跨域最好不要直接用注解形式,很麻烦,因为如果有需要设置的内容时还要一个一个找到注解更改,直接配置bean方便很多
1 @Bean 2 private CorsConfiguration buildConfig() { 3 CorsConfiguration corsConfiguration = new CorsConfiguration(); 4 corsConfiguration.addAllowedHeader("*"); 5 corsConfiguration.addAllowedOrigin("*"); 7 corsConfiguration.addAllowedMethod("*"); 8 corsConfiguration.setMaxAge(3600L); // 预检请求的有效期,单位为秒。 9 corsConfiguration.setAllowCredentials(true);// 是否支持安全证书(必需参数) 10 return corsConfiguration; 11 } 12 13 @Bean 14 public CorsFilter corsFilter() { 15 UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 16 source.registerCorsConfiguration("/**", buildConfig()); 17 return new CorsFilter(source); 18 }
1. 跨域一般都会遇到能登陆但是不进授权的问题,因为shiro存储认证信息是在登录后存在浏览器的cookie中,访问授权接口时会从cookie中取出认证信息进行认证,但是跨域cookie传不到后台,用了另一种办法,把认证信息存在请求头中
https://www.cnblogs.com/elvinle/p/9272076.html-比较详细
用了这种方式后把会话管理器注册到DefaultWebSecurityManager ,这样登录后把认证信息放在响应头中返回,前端取出来放在请求头中发回来,就是从请求头中直接拿认证信息了
@Bean(name = "sessionManager") public DefaultHeaderSessionManager sessionManager() { DefaultHeaderSessionManager sessionManager = new DefaultHeaderSessionManager(); // 设置session过期时间3600s sessionManager.setGlobalSessionTimeout(3600000L); sessionManager.setSessionValidationInterval(3600000L); return sessionManager; } @Bean public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setSessionManager(sessionManager()); securityManager.setRealm(myShiroRealm()); return securityManager; }
1.1 这里还有个小问题
https://segmentfault.com/q/1010000019535285---比较详细
在使用跨域的时候前端不能直接从响应头中取数据,为null。因为在使用跨域的方式进行前后端的交互时,浏览器只会使用默认的header。而认证信息是新添加的所以没效果,需要告诉浏览器,这个请求头数据要用,你得给前端才行
response.setHeader("key", token);
response.setHeader("Access-Control-Expose-Headers", "请求头的key");
这是在登陆后,把认证信息放入响应头后,添加这行代码,浏览器才会知道你要用,才能拿到
2. 暂时没二