spring-shiro.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd"> <description>Shiro Configuration</description> <!-- 加载配置属性文件 --> <context:property-placeholder ignore-unresolvable="true" location="classpath*:/csairjee.properties" /> <!-- 安全认证过滤器 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager" /> <!-- <property name="loginUrl" value="${adminPath}/login" /> <property name="loginUrl" value="/" /> <property name="successUrl" value="${adminPath}" /> <property name="successUrl" value="/home/*" /> <property name="unauthorizedUrl" value="/nopermission.jsp" /> <property name="filters"> <map> <entry key="authc" value-ref="formAuthenticationFilter"/> </map> </property> --> <property name="filterChainDefinitions"> <value> <!-- /static/** = anon /**/#/home = anon /**/uploadPic = anon /**/uploadAvatar = anon /userfiles/** = anon /visitor/** = anon /verification/** = anon /home/** = authc ${adminPath}/login = authc ${adminPath}/logout = logout ${adminPath}/** = user --> </value> </property> </bean> <!-- 用户授权信息Cache, 采用EhCache --> <bean id="shiroCacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"> <property name="cacheManager" ref="cacheManager"/> </bean> <!-- EhCache缓存配置 begin--> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="classpath:cache/ehcache-local.xml" /> </bean> <!-- EhCache缓存配置 end--> <!-- Shiro安全接口 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="sessionManager" ref="sessionManager" /> <property name="realm" ref="shiroDbRealm" /> <property name="cacheManager" ref="shiroCacheManager"></property> <!-- <property name="rememberMeManager.cookie.name" value="rememberMe"/> <property name="rememberMeManager.cookie.maxAge" value="3*60"/> --> </bean> <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <property name="globalSessionTimeout" value="3600000"/> <property name="sessionDAO" ref="shiroSessionDAO"/> <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/> <property name="sessionValidationSchedulerEnabled" value="true"/> <property name="sessionIdCookie" ref="wapsession"/> </bean> <!--自定义session存储容器--> <bean id="shiroSessionDAO" class="com.csair.csmbp.web.common.shiro.session.impl.ShiroSessionDAO"> <property name="shiroSessionRepository" ref="redisShiroSessionRepository"></property> </bean> <!--由redis做session存储容器 <bean id="redisShiroSessionDAO" class="com.csair.csmbp.web.common.shiro.session.impl.RedisShiroSessionDAO"> <property name="shiroSessionRepository" ref="redisShiroSessionRepository"></property> <property name="expire" value="${mvn.shiro.session.timeout}"></property> </bean> --> <!-- custom shiro session listener --> <bean id="shiroSessionListener" class="com.csair.csmbp.web.listeners.ShiroSessionListener"> <property name="shiroSessionRepository" ref="redisShiroSessionRepository"/> </bean> <!-- redis缓存shiro session库 --> <bean id="redisShiroSessionRepository" class="com.csair.csmbp.web.common.shiro.session.impl.RedisShiroSessionRepository"> <property name="jedisClusterHelper" ref="jedisClusterHelper"/> <property name="expire" value="${mvn.shiro.session.timeout}"></property> </bean> <!--redisCacheManager要实现org.apache.shiro.cache.CacheManager接口,让shiro使用redis的缓存 <bean id="shiroCacheManager" class="com.csair.csmbp.web.common.shiro.cache.impl.ShiroCacheManager"> <property name="customerCacheManager" ref="redisCacheManager"></property> </bean> --> <!-- redis缓存cache <bean id="redisCacheManager" class="com.csair.csmbp.web.common.shiro.cache.impl.RedisCacheManager"> <property name="jedisClusterHelper" ref="jedisClusterHelper"></property> </bean> --> <!-- 指定本系统SESSIONID, 默认为: JSESSIONID 问题: 与SERVLET容器名冲突, 如JETTY, TOMCAT 等默认JSESSIONID, 当跳出SHIRO SERVLET时如ERROR-PAGE容器会为JSESSIONID重新分配值导致登录会话丢失! --> <bean id="wapsession" class="org.apache.shiro.web.servlet.SimpleCookie"> <constructor-arg name="name" value="WAPSESSIONID"/> </bean> <!-- 定时清理僵尸session,Shiro会启用一个后台守护线程定时执行清理操作 用户直接关闭浏览器造成的孤立会话 --> <bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler"> <property name="interval" value="3600000"/> <property name="sessionManager" ref="sessionManager"/> </bean> <!-- 用户自定义Realm --> <bean id="shiroDbRealm" class="com.csair.csmbp.web.common.shiro.realm.ShiroDbRealm"> <!-- <property name="credentialsRealm" ref="customCredentialsRealm"/> --> </bean> <!-- 保证实现了Shiro内部lifecycle函数的bean执行 --> <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/> <!-- AOP式方法级权限检查 启用shiro注解 --> <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"> <property name="proxyTargetClass" value="true" /> </bean> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"/> </bean> </beans>
在web.xml添加
<filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
pom.xml中添加
<!-- SECURITY shiro begin --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>${shiro.version}</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>${shiro.version}</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>${shiro.version}</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-ehcache</artifactId> <version>${shiro.version}</version> </dependency> <!-- SECURITY shiro end --> ----------------------------------------------------------------------------------- <mvn.redis.clusterserver>10.92.21.17:6379,10.92.21.17:7379,10.92.21.17:8379,10.92.21.18:6380,10.92.21.18:7380,10.92.21.18:8380</mvn.redis.clusterserver>
config.properties中添加
#Redis Cluster redis.clusterserver=${mvn.redis.clusterserver}
在JedisClusterHelper中添加
public void flushDB(){ String[] clusterServers = this.clusterServers.split(","); for(String clusterServer:clusterServers){ Jedis jedis = jedisCluster.getClusterNodes().get(clusterServer).getResource(); jedis.flushDB(); } } public Set<byte[]> keys(String pattern){ Set<byte[]> keys = null; keys.add("begin".getBytes()); String[] clusterServers = this.clusterServers.split(","); for(String clusterServer:clusterServers){ Jedis jedis = jedisCluster.getClusterNodes().get(clusterServer).getResource(); boolean isBroken = false; try{ Set<byte[]> tempKeys = jedis.keys(pattern.getBytes()); keys.addAll(tempKeys); }catch(Exception e){ isBroken = true; }finally{ // returnResource(jedis, isBroken); } } keys.remove("begin".getBytes()); return keys; }
ShiroSessionRepository
package com.csair.csmbp.web.common.shiro.session; import org.apache.shiro.session.Session; import java.io.Serializable; import java.util.Collection; public interface ShiroSessionRepository { void saveSession(Session session); void deleteSession(Serializable sessionId); Session getSession(Serializable sessionId); Collection<Session> getAllSessions(); }
ShiroSessionDAO
package com.csair.csmbp.web.common.shiro.session.impl; import java.io.Serializable; import java.util.Collection; import org.apache.shiro.session.Session; import org.apache.shiro.session.UnknownSessionException; import org.apache.shiro.session.mgt.eis.AbstractSessionDAO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.csair.csmbp.web.common.shiro.session.ShiroSessionRepository; public class ShiroSessionDAO extends AbstractSessionDAO { private Logger logger = LoggerFactory.getLogger(getClass()); private ShiroSessionRepository shiroSessionRepository; public ShiroSessionRepository getShiroSessionRepository() { return shiroSessionRepository; } public void setShiroSessionRepository( ShiroSessionRepository shiroSessionRepository) { this.shiroSessionRepository = shiroSessionRepository; } @Override public void delete(Session session) { // TODO Auto-generated method stub if (session == null) { return; } Serializable id = session.getId(); if (id != null) { logger.info("delete session----:"+id); getShiroSessionRepository().deleteSession(id); } } @Override public Collection<Session> getActiveSessions() { // TODO Auto-generated method stub return getShiroSessionRepository().getAllSessions(); } @Override public void update(Session session) throws UnknownSessionException { // TODO Auto-generated method stub logger.info("update session----更新:"+session.getId()); getShiroSessionRepository().saveSession(session); } @Override protected Serializable doCreate(Session session) { // TODO Auto-generated method stub Serializable sessionId = this.generateSessionId(session); this.assignSessionId(session, sessionId); getShiroSessionRepository().saveSession(session); logger.info("do create session----建完后:"+sessionId); return sessionId; } @Override protected Session doReadSession(Serializable sessionId) { // TODO Auto-generated method stub // logger.info("do read session----参数:"+sessionId); return getShiroSessionRepository().getSession(sessionId); } }
BaseController中添加
protected void setSessionAttribute(String key,Object obj){ Subject currentUser = SecurityUtils.getSubject(); Session session = currentUser.getSession(); session.setAttribute(key, obj); } protected Object getSessionAttribute(String key){ Subject currentUser = SecurityUtils.getSubject(); Session session = currentUser.getSession(); return session.getAttribute(key); }
在普通的controller中调用
@RequestMapping(value = "test/setRedisSession.do")//test/zooKeeper.do?key=test @ResponseBody public void setSessionValue(){ setSessionAttribute("TESTSESSION", "mysession"); logger.info("TESTSESSION==========" + (String)getSessionAttribute("TESTSESSION")); }
相关推荐
项目描述 在上家公司自己集成的一套系统,用了...Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis 数据库文件 压缩包内 jar包文件 maven搭建 Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级报表后台管理系统 ...
Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级报表后台管理系统Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级报表后台管理系统Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级报表后台管理...
基于 SpringBoot + Spring + SpringMvc + Mybatis + Shiro+ Redis 开发单点登录管理系统 基于 SpringBoot + Spring + SpringMvc + Mybatis + Shiro+ Redis 开发单点登录管理系统 基于 SpringBoot + Spring + ...
本后台管理系统,采用流行的框架springMvc+spring+mybatis+shiro+redis+ehcache开发,实现了权限管理(菜单权限、数据权限),solr全文搜索引擎,activiti工作流程引擎,cas单点登陆等功能,完善的代码生成器 后期还...
这个"springMVC+mybatis+shiro+redis 项目整合demo"就是一个实例,展示了如何将这些技术集成到一个项目中,以实现高效的数据处理、用户认证授权和缓存管理。 首先,`SpringMVC` 是 Spring 框架的一部分,它是一个...
Spring+SpringMVC+MyBatis+Shiro+MySQL+Redis+Maven+EasyUI+Bootstrap实现的通用权限管理系统。 Spring+SpringMVC+MyBatis+Shiro+MySQL+Redis+Maven+EasyUI+Bootstrap实现的通用权限管理系统 Spring+SpringMVC+...
项目描述 说明: spring security 全注解式的权限管理 动态配置权限,角色和资源,权限控制到...Springboot+Mybatis+ SpringMvc+springsecrity+Redis+bootstrap+jquery 数据库文件 压缩包内 jar包文件 maven搭建
"Shiro+SpringMVC+Redis+MySQL实现单点登录"是一个典型的系统安全架构,它整合了多个技术组件来构建一个高效、可靠的单点登录(Single Sign-On, SSO)解决方案。以下是关于这个主题的详细知识点: 1. **Apache ...
项目描述 在上家公司自己集成的一套系统,用了两个多月的时间完成的:Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级开发系统 Springboot作为容器,使用mybatis作为持久层框架 使用官方推荐的thymeleaf做为...
基于IDEA+Spring+SpringMVC+Mybatis+Redis+Shiro+Maven实现的教务管理系统+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于IDEA+Spring+SpringMVC+...
使用SpringMVC、Shiro、Redis写的小demo, 配置: JDK 1.7+; MySql 5.+; Maven3.+; spring:4.1.7.RELEASE; shiro:1.2.5; mybatis:3.3.0; druid:1.0.25;redis:2.8.0; - - - - - - 神奇传送阵( ﹁ ﹁ ) ~→...
本示例项目"springmvc+shiro+spring+hibernate+redis缓存管理示例"提供了一个全面的框架整合实例,它将几个关键的技术组件融合在一起,旨在帮助开发者实现更优的性能和安全性。以下是关于这些技术组件及其在项目中的...
这是一个基于Java技术栈的完整网站后台管理系统,主要利用了Spring Boot、MyBatis、Spring MVC、Spring Security和Redis等核心技术。下面将详细讲解这些技术及其在系统中的作用。 首先,Spring Boot是Spring框架的...
总之,这个"spring+springMVC+shiro 完美例子"是一个很好的学习资源,帮助开发者深入理解如何在Java Web应用中集成和使用这些强大的框架,实现安全、高效的权限管理。通过分析和实践这个例子,开发者不仅可以提升...
- **Session管理**:Shiro提供了统一的会话管理,可跨应用共享会话数据。 - **Caching**:缓存支持,提高性能,减少对数据库的访问。 整合这三个框架,可以创建一个高效、安全的Java Web应用。Spring MVC处理HTTP...
一个权限管理系统,以SpringMvc+MiniJdbc+Shiro+MySQL+MQ+Redis+Flappy+Maven为架构,实现了用户-角色-权限三者结合的功能权限颗粒化控制。 一个权限管理系统,以SpringMvc+MiniJdbc+Shiro+MySQL+MQ+Redis+Flappy+...
后端功能:商品的管理、购物车管理、用户...服务端使用SSM框架(Spring+SpringMVC+MyBatis)+shiro+Maven,使用Myeclipse进行开发。前端使用MUi和HUI框架和vue(与后台交互模板)和Html5+css3来实现移动端App的开发。
本项目以“maven+springmvc+redis+mybatis整合”为主题,旨在提供一个基于这些技术的集成框架,特别强调了利用Redis作为缓存来提升应用性能。下面将详细阐述这个框架中的各个组成部分以及它们之间的协作。 首先,...