开发者社区> 问答> 正文

springboot+shiro+redis实现session缓存到redis?报错

大家好,有做过redis缓存shiro session的吗?这个session序列化缓存到redis采用什么序列化方式?能序列化成json格式吗?我使用redistemple jackson2的序列化,可以缓存json但是读取会报错,有一个字段 valid 不识别,很郁闷,同一个实体对象存入可以读取失败,,,

展开
收起
爱吃鱼的程序员 2020-06-06 20:18:31 1190 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
                        spring session 
                    
    
                        <p>我是使用的shiro-spring和第三方的包shiro-redis</p>
    

    代码如下 

    ShiroProperty类中是redis的一些配置属性

    @Configuration

    public class ShiroConfig {

     

        

     

        @Bean

        public ShiroProperty shiroProperty() {

            return new ShiroProperty();

        }

        

        @Bean

        public ShiroFilterFactoryBean shiroFilterFactoryBean() {

            ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

            // 配置安全管理(必须)

            shiroFilterFactoryBean.setSecurityManager(securityManager());

     

            Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();

            // 注意过滤器配置顺序 不能颠倒

            // 配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了,登出后跳转配置的loginUrl

            // 配置不会被拦截的链接 顺序判断

            filterChainDefinitionMap.put("/login*", "anon");

            filterChainDefinitionMap.put("/logout*", "anon");

            filterChainDefinitionMap.put("/loginToSite*", "anon");

            filterChainDefinitionMap.put("/static/**", "anon");

            filterChainDefinitionMap.put("/**", "authc");

            // 配置shiro默认登录界面地址,前后端分离中登录界面跳转应由前端路由控制,后台仅返回json数据

            shiroFilterFactoryBean.setLoginUrl(shiroProperty().loginUrl);

            // 登录成功后要跳转的链接

            // shiroFilterFactoryBean.setSuccessUrl("/index");

            //未授权界面;

            shiroFilterFactoryBean.setUnauthorizedUrl("/403");

            shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

            return shiroFilterFactoryBean;

        }

     

        @Bean

        public SecurityManager securityManager() {

            DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();

            // 设置realm.

            securityManager.setRealm(restShiroRealm());

            // 自定义缓存实现 使用redis

            // securityManager.setCacheManager(cacheManager());

            // 自定义session管理 使用redis

            securityManager.setSessionManager(sessionManager());

            return securityManager;

        }

     

        /**

         * 凭证匹配器 (由于我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了

         * 所以我们需要修改下doGetAuthenticationInfo中的代码; )

         * 

         * @return

         */

        @Bean

        public HashedCredentialsMatcher hashedCredentialsMatcher() {

            HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();

     

            hashedCredentialsMatcher.setHashAlgorithmName("md5");// 散列算法:这里使用MD5算法;

            hashedCredentialsMatcher.setHashIterations(2);// 散列的次数,比如散列两次,相当于 md5(md5(""));

     

            return hashedCredentialsMatcher;

        }

     

        /**

         * 开启shiro aop注解支持. 使用代理方式;所以需要开启代码支持;

         * 

         * @param securityManager

         * @return

         */

        @Bean

        public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {

            AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();

            authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);

            return authorizationAttributeSourceAdvisor;

        }

     

        /**

         * 配置shiro redisManager 使用的是shiro-redis开源插件

         * 

         * @return

         */

        public RedisManager redisManager() {

            RedisManager redisManager = new RedisManager();

            redisManager.setHost(shiroProperty().hostname);

            redisManager.setPort(shiroProperty().port);

            redisManager.setExpire(shiroProperty().expire);// 配置缓存过期时间

            redisManager.setTimeout(shiroProperty().timeout);

            // redisManager.setPassword(password);

            return redisManager;

        }

     

        /**

         * cacheManager 缓存 redis实现 使用的是shiro-redis开源插件

         * 

         * @return

         */

        public RedisCacheManager cacheManager() {

            RedisCacheManager redisCacheManager = new RedisCacheManager();

            redisCacheManager.setRedisManager(redisManager());

            return redisCacheManager;

        }

     

        /**

         * RedisSessionDAO shiro sessionDao层的实现 通过redis 使用的是shiro-redis开源插件

         */

        @Bean

        public RedisSessionDAO redisSessionDAO() {

            RedisSessionDAO redisSessionDAO = new RedisSessionDAO();

            redisSessionDAO.setRedisManager(redisManager());

            return redisSessionDAO;

        }

     

        /**

         * shiro session的管理

         */

        @Bean

        public DefaultWebSessionManager sessionManager() {

            DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();

            sessionManager.setSessionDAO(redisSessionDAO());

            sessionManager.setSessionIdCookie(simpleCookie());

            return sessionManager;

        }

     

        /****

         * 自定义Real

         * 

         * @return

         */

        @Bean

        public RestShiroRealm restShiroRealm() {

            RestShiroRealm realm = new RestShiroRealm();

            // 根据情况使用缓存器

            return realm;

        }

     

        @Bean

        public  LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {

            return new LifecycleBeanPostProcessor();

        }

     

        @Bean

        @ConditionalOnMissingBean

        public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {

            DefaultAdvisorAutoProxyCreator daap = new DefaultAdvisorAutoProxyCreator();

            daap.setProxyTargetClass(true);

            return daap;

        }

        

        @Bean

        public SimpleCookie simpleCookie() {

            SimpleCookie simpleCookie = new SimpleCookie("sid");

            simpleCookie.setName("WEBSID");

            simpleCookie.setPath("/");

            return simpleCookie;

        }

    2020-06-06 20:18:42
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
基于英特尔 SSD 的虚拟机缓存解决SSD 立即下载
用户态高速块缓存方案 立即下载
高性能Web架构之缓存体系 立即下载