码迷,mamicode.com
首页 > 其他好文 > 详细

shiro框架使用中踩得坑,总结一下加深印象

时间:2020-01-10 20:06:19      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:请求   log   方式   登录   参数   ken   接口   conf   als   

首先,说明运行环境,前后端分离,跨域。

先说一下跨域,跨域最好不要直接用注解形式,很麻烦,因为如果有需要设置的内容时还要一个一个找到注解更改,直接配置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. 暂时没二

shiro框架使用中踩得坑,总结一下加深印象

标签:请求   log   方式   登录   参数   ken   接口   conf   als   

原文地址:https://www.cnblogs.com/mssyj/p/12177710.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!