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

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

先说一下跨域,跨域最好不要直接用注解形式,很麻烦,因为如果有需要设置的内容时还要一个一个找到注解更改,直接配置bean方便很多

@Bean
    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.setMaxAge(3600L);         // 预检请求的有效期,单位为秒。
        corsConfiguration.setAllowCredentials(true);// 是否支持安全证书(必需参数)
        return corsConfiguration;
    }

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", buildConfig());
        return new CorsFilter(source);
    }

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. 暂时没二

相关推荐