shiro框架搭建(maven+spring+jpa+hibernate配置)

这个是maven依赖配置

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>org.apache.shiro.samples</groupId>
	<artifactId>shiro-web</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>

	<properties>
		<slf4j.version>1.7.7</slf4j.version>
		<logback.version>1.1.7</logback.version>
		<spring.version>4.3.10.RELEASE</spring.version>
		<mysql.version>5.1.38</mysql.version>
		<ehcache.version>2.6.6</ehcache.version>
		<hibernate.version>4.3.11.Final</hibernate.version>
		<jackson.version>2.6.7</jackson.version>
		<jackson-datatype-hibernate4.version>2.6.7</jackson-datatype-hibernate4.version>
		<quartz.version>2.3.0</quartz.version>
		<shiro.version>1.2.3</shiro.version>
	</properties>

	<dependencies>
		<!-- 单元测试 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
		<!-- 日志框架 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${slf4j.version}</version>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>${logback.version}</version>
			<scope>runtime</scope>
		</dependency>
		<!-- 代码直接调用log4j会被桥接到slf4j -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>log4j-over-slf4j</artifactId>
			<version>${slf4j.version}</version>
			<scope>runtime</scope>
		</dependency>
		<!-- 代码直接调用common-logging会被桥接到slf4j -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>${slf4j.version}</version>
			<scope>runtime</scope>
		</dependency>
		<!-- 代码直接调用java.util.logging会被桥接到slf4j -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jul-to-slf4j</artifactId>
			<version>${slf4j.version}</version>
			<scope>runtime</scope>
		</dependency>
		<!-- 日志处理end -->
		<!-- Apache工具组件 -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>3.3.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-io</artifactId>
			<version>1.3.2</version>
		</dependency>
		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
			<version>1.2</version>
		</dependency>
		<dependency>
			<groupId>commons-beanutils</groupId>
			<artifactId>commons-beanutils</artifactId>
			<version>1.8.3</version>
		</dependency>
		<!-- shiro session管理使用 -->
		<dependency>
			<groupId>commons-collections</groupId>
			<artifactId>commons-collections</artifactId>
			<version>3.2.2</version>
		</dependency>
		<!-- 文件上传组件 -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.1</version>
		</dependency>
		<!-- spring start -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<!-- spring-junit集成测试 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${spring.version}</version>
			<scope>test</scope>
		</dependency>
		<!-- spring end -->
		<!-- JSP相关 -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
			<!-- 有bug -->
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.0</version>
			<scope>provided</scope>
		</dependency>
		<!-- MySql -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.32</version>
		</dependency>
		<!-- 数据库连接池,管理数据库连接 -->
		<dependency>
			<groupId>com.mchange</groupId>
			<artifactId>c3p0</artifactId>
			<version>0.9.5.2</version>
		</dependency>
		<!-- 缓存框架 -->
		<dependency>
			<groupId>net.sf.ehcache</groupId>
			<artifactId>ehcache-core</artifactId>
			<version>${ehcache.version}</version>
		</dependency>
		<!-- orm框架配置 -->
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-commons</artifactId>
			<version>1.12.4.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-jpa</artifactId>
			<version>1.10.4.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>dom4j</groupId>
			<artifactId>dom4j</artifactId>
			<version>1.6.1</version>
		</dependency>
		<dependency>
			<groupId>org.jboss.logging</groupId>
			<artifactId>jboss-logging</artifactId>
			<version>3.3.0.Final</version>
		</dependency>
		<!-- hibernate -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>${hibernate.version}</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-entitymanager</artifactId>
			<version>${hibernate.version}</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-c3p0</artifactId>
			<version>${hibernate.version}</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-ehcache</artifactId>
			<version>${hibernate.version}</version>
		</dependency>
		<!-- orm框架配置 end -->
		<!-- json数据处理 -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>${jackson.version}</version>
		</dependency>
		<!-- 解决Json+hibernate序列化异常 -->
		<dependency>
			<groupId>com.fasterxml.jackson.module</groupId>
			<artifactId>jackson-module-jaxb-annotations</artifactId>
			<version>${jackson.version}</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.datatype</groupId>
			<artifactId>jackson-datatype-hibernate4</artifactId>
			<version>${jackson-datatype-hibernate4.version}</version>
		</dependency>
		<!-- 邮件 -->
		<dependency>
			<groupId>javax.mail</groupId>
			<artifactId>mail</artifactId>
			<version>1.4.7</version>
		</dependency>
		<!-- 安全框架 -->
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-spring</artifactId>
			<version>${shiro.version}</version><!-- 1.2.3 -->
		</dependency>
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-ehcache</artifactId>
			<version>${shiro.version}</version>
		</dependency>
		<!-- 定时任务,需要spring-context-support -->
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz</artifactId>
			<version>${quartz.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-quartz</artifactId>
			<version>1.4.0</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<!-- 项目启动jar包依赖加载 -->
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>exec-maven-plugin</artifactId>
				<configuration>
					<mainClass>org.apache.shiro.samples.spring.CliApp</mainClass>
				</configuration>
			</plugin>
			<!-- java编译插件 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.2</version>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

缓存配置

<ehcache>
	<!-- 缓存持久化保存 -->
	<diskStore path="java.io.tmpdir" />

	<!-- 默认配置必须添加,不然有可能报错 -->
	<defaultCache maxEntriesLocalHeap="1000" eternal="false"
		timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="true"
		maxElementsOnDisk="10000000" diskPersistent="false"
		diskExpiryThreadIntervalSeconds="1000" memoryStoreEvictionPolicy="LRU">
	</defaultCache>

	<!-- shiro认证缓存 -->
	<cache name="authenticationCache" maxEntriesLocalHeap="2000"
		eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0"
		overflowToDisk="false" statistics="true" memoryStoreEvictionPolicy="LRU">
	</cache>
	<!-- shiro授权缓存 -->
	<cache name="authorizationCache" maxEntriesLocalHeap="2000"
		eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0"
		overflowToDisk="false" statistics="true" memoryStoreEvictionPolicy="LRU">
	</cache>
	<!-- shiro-session缓存 -->
	<cache name="shiro-activeSessionCache" maxEntriesLocalHeap="2000"
		eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0"
		overflowToDisk="false" statistics="true" memoryStoreEvictionPolicy="LRU">
	</cache>

</ehcache>

spring配置

<?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:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:util="http://www.springframework.org/schema/util"
	xmlns:cache="http://www.springframework.org/schema/cache"
	xsi:schemaLocation="http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.3.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.8.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd">
	<!-- springIOC容器,托管所有需要托管的bean,除了springMVC容器托管的,jpa管理的 -->
	<!-- 配置自动扫描的包 -->
	<context:component-scan base-package="com.szhis.frsoft">
		<context:exclude-filter type="annotation"
			expression="org.springframework.stereotype.Controller" />
		<context:exclude-filter type="annotation"
			expression="org.springframework.web.bind.annotation.ControllerAdvice" />
		<context:exclude-filter type="regex"
			expression="com\.szhis\.frsoft\.web\..*" />
		<context:exclude-filter type="regex"
			expression="com\.szhis\.frsoft\.entity\..*" />
		<context:exclude-filter type="regex"
			expression="com\.szhis\.frsoft\.repository\..*" />
		<context:exclude-filter type="regex"
			expression="com\.szhis\.frsoft\.bo\..*" />
	</context:component-scan>

	<!-- 配置数据源,引用外部属性文件 -->
	<context:property-placeholder location="classpath:property/db.properties" />

	<!-- 数据源1: mysql -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close">
		<property name="driverClass" value="${dbOne.jdbc.driverClass}" />
		<property name="jdbcUrl" value="${dbOne.jdbc.url}" />
		<property name="user" value="${dbOne.jdbc.user}" />
		<property name="password" value="${dbOne.jdbc.password}" />
		<property name="initialPoolSize" value="${dbOne.jdbc.initialPoolSize}" />
		<property name="minPoolSize" value="${dbOne.jdbc.minPoolSize}" />
		<property name="maxPoolSize" value="${dbOne.jdbc.maxPoolSize}" />
		<property name="maxStatements" value="350" />
		<property name="maxStatementsPerConnection" value="50" />
		<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 hibernate.c3p0.acquire_incremen -->
		<property name="acquireIncrement" value="3" />
		<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
		<property name="acquireRetryAttempts" value="30" />
		<!--两次连接中间隔时间,单位毫秒。Default: 1000 -->
		<property name="acquireRetryDelay" value="1000" />
		<!-- 设置获取不到连接是否彻底中断 -->
		<property name="breakAfterAcquireFailure" value="false" />
	</bean>

	<!-- 配置JPA-entity管理方式 -->
	<bean id="entityManagerFactory" autowire="byName"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<!-- 扫描jpa需要持久化的entity -->
		<property name="packagesToScan">
			<array>
				<value>com.szhis.frsoft.entity</value>
			</array>
		</property>
		<!-- 配置orm实现者:hibernate,mybatis -->
		<property name="jpaVendorAdapter">
			<bean id="hibernateJpaVendorAdapter"
				class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
				<property name="generateDdl" value="false" />
				<!-- 可以修改数据库 -->
				<property name="database" value="MYSQL" />
				<property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
			</bean>
		</property>
		<!-- 指定JPA属性 -->
		<property name="jpaProperties">
			<props>
				<!--打印sql -->
				<prop key="hibernate.show_sql">false</prop>
				<!--格式化显示sql -->
				<prop key="hibernate.format_sql">false</prop>
				<!--数据库字段名称映射规则user_name自动转userName -->
				<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
				<!--fetch查询大小 -->
				<prop key="hibernate.jdbc.fetch_size">30</prop>
				<!--batch查询大小 -->
				<prop key="hibernate.jdbc.batch_size">15</prop>
				<prop key="hibernate.order_inserts">true</prop>
				<prop key="hibernate.order_updates">true</prop>
				<!-- 主键生成策略PooledLoOptimizer=true和PooledOptimizer=false -->
				<prop key="hibernate.id.optimizer.pooled.prefer_lo">true</prop>
				<!-- 项目全部使用注解,此时就没必要扫描hbm了,禁用掉 -->
				<prop key="hibernate.archive.autodetection">class</prop>
				<!-- 不使用NamedQuery,禁用掉 -->
				<prop key="hibernate.query.startup_check">false</prop>
				<!-- 是否开启检测注解为nullable -->
				<prop key="hibernate.check_nullability">false</prop>
				<!-- 关闭bean validate验证 -->
				<prop key="javax.persistence.validation.mode">none</prop>
				<prop key="hibernate.id.new_generator_mappings">true</prop>
				<!-- =============================================================================================== -->
				<!-- 开启一级缓存,启用"查询缓存" -->
				<!-- 如果想缓存使用findAll()、list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集,必须配置此项 -->
				<prop key="hibernate.cache.use_query_cache">true</prop>
				<!-- 统计查询 -->
				<prop key="hibernate.generate_statistics">false</prop>
				<!-- 开启二级缓存 -->
				<prop key="hibernate.cache.use_second_level_cache">true</prop>
				<!-- 指定二级缓存实现类 -->
				<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
				</prop>
				<!-- 在实体类上写@Cacheable就可以开启二级缓存,不需要@Cach -->
				<prop key="javax.persistence.sharedCache.mode">ENABLE_SELECTIVE</prop>
			</props>
		</property>
	</bean>

	<!-- 配置事务管理 -->
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory"></property>
	</bean>

	<!-- 配置支持基于注解的事务 -->
	<tx:annotation-driven transaction-manager="transactionManager" />

	<!-- 配置JPA-dao管理 -->
	<jpa:repositories base-package="com.szhis.frsoft.repository"
		transaction-manager-ref="transactionManager"
		entity-manager-factory-ref="entityManagerFactory"
		repository-impl-postfix="Impl" />

	<!-- messageSource.basenames使用类路径(ClassPath)或者使用文件路径(FilePath) -->
	<!-- 正确示例如:cn/com/conf/message、cn.com.conf.message,路径以/或.作为分隔符, -->
	<!-- 所以消息文件名(除了扩展名)中不能包含斜杠和点, 文件命名规则如下(basename中不能再有下划线, -->
	<!-- 框架通过下划线来识别语言和国家): basename_language_country.properties -->
	<bean id="messageSource"
		class="org.springframework.context.support.ResourceBundleMessageSource"
		lazy-init="true">
		<property name="basenames">
			<list>
				<value>locale.message.pub_zh</value>
			</list>
		</property>
		<property name="fallbackToSystemLocale" value="false" />
		<property name="defaultEncoding" value="UTF-8" />
		<property name="useCodeAsDefaultMessage" value="true" />
	</bean>

	<!-- 配置缓存管理 -->
	<import resource="classpath:spring/spring-cache.xml" />

	<!-- 将shiro配置放入其他文件 -->
	<import resource="classpath:spring/spring-shiro.xml" />

</beans>
spring-shiro.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.springframework.org/schema/beans" xmlns:cache="http://www.springframework.org/schema/cache"
	xsi:schemaLocation="http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.3.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
	<description>shiro权限配置文件</description>

	<!-- 配置shiro的过滤器工厂类,id- shiroFilter要和我们在web.xml中配置的过滤器一致 -->
	<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		<!-- 调用我们配置的权限管理器 -->
		<property name="securityManager" ref="securityManager" />
		<!-- 配置我们的登录请求地址 -->
		<property name="loginUrl" value="/anyone/login.html" />
		<!-- 配置我们在登录页登录成功后的跳转地址,如果你访问的是非/login地址,则跳到您访问的地址 -->
		<property name="successUrl" value="/anyone/success.html" />
		<!-- 如果您请求的资源不再您的权限范围,则跳转到/403请求地址 -->
		<property name="unauthorizedUrl" value="/anyone/unauthorized.html" />
		<!-- 权限配置 -->
		<property name="filterChainDefinitions">
			<value>
				/index.html=anon
				/indexDevp.html=anon
				/anyone/**=anon
				/static/**=anon
				/third-party/**=anon
				/login=anon
				/logout=logout
				/admin/**=authc
				/app/**=authc
				/api/**=authc
				/**=authc
			</value>
		</property>
	</bean>

	<!-- 安全管理器 -->
	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
		<!-- 缓存管理器 -->
		<property name="cacheManager" ref="shiroCacheManager" />
		<!-- session管理器 -->
		<property name="sessionManager" ref="sessionManager" />
		<!-- 获取用户认证和权限信息 -->
		<property name="realm" ref="userRealm" />
	</bean>

	<!-- 定义会话管理器的操作 -->
	<bean id="sessionManager"
		class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
		<!-- 定义的是全局的session会话超时时间,此操作会覆盖web.xml文件中的超时时间配置 -->
		<property name="globalSessionTimeout" value="1000000" />
		<!-- 删除所有无效的Session对象,此时的session被保存在了内存里面 -->
		<property name="deleteInvalidSessions" value="true" />
		<!-- 定义要使用的无效的Session定时调度器 -->
		<property name="sessionValidationScheduler" ref="sessionValidationScheduler" />
		<!-- 需要让此session可以使用该定时调度器进行检测 -->
		<property name="sessionValidationSchedulerEnabled" value="true" />
		<!-- 定义Session可以进行序列化的工具类 -->
		<property name="sessionDAO" ref="sessionDAO" />
		<!-- 所有的session一定要将id设置到Cookie之中,需要提供有Cookie的操作模版 -->
		<property name="sessionIdCookie" ref="sessionIdCookie" />
		<!-- 定义sessionIdCookie模版可以进行操作的启用 -->
		<property name="sessionIdCookieEnabled" value="true" />
	</bean>
	<!-- 会话验证调度器 -->
	<bean id="sessionValidationScheduler"
		class="org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler">
		<property name="sessionManager" ref="sessionManager" />
		<!-- 设置调度时间间隔,单位毫秒,默认10分钟 -->
		<property name="interval" value="600000" />
	</bean>
	<!-- 配置Session DAO的操作处理, -->
	<!-- 指的是你的会话的缓存位置,本次暂时将所有的会话数据保存在内存里面 -->
	<bean id="sessionDAO"
		class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">
		<!-- 设置session缓存的名字,这个名字可以任意 -->
		<property name="activeSessionsCacheName" value="shiro-activeSessionCache" />
		<!-- 定义该Session DAO操作中所使用的ID生成器 -->
		<property name="sessionIdGenerator" ref="sessionIdGenerator" />
	</bean>
	<!-- 定义Session ID生成管理器 -->
	<bean id="sessionIdGenerator"
		class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator" />
	<!-- 配置需要向Cookie中保存数据的配置模版 -->
	<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
		<!-- 在Tomcat运行下默认使用的Cookie的名字为JSESSIONID -->
		<constructor-arg value="mldn-session-id" />
		<!-- 保证该系统不会受到跨域的脚本操作供给 -->
		<property name="httpOnly" value="true" />
		<!-- 定义Cookie的过期时间,单位为秒,如果设置为-1表示浏览器关闭,则Cookie消失,60*60*12=1天 -->
		<property name="maxAge" value="86400" />
	</bean>

	<!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
	<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />

	<!-- 用配置文件方式注入,方便修改信息 -->
	<bean id="userRealm" class="com.szhis.frsoft.common.shiro.UserRealm">
		<property name="name" value="userRealm" />
		<!-- 密码匹配器 -->
		<property name="credentialsMatcher">
			<bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
				<!-- 算法名称 -->
				<property name="hashAlgorithmName" value="MD5"></property>
				<!-- 迭代次数 -->
				<property name="hashIterations" value="1"></property>
			</bean>
		</property>
	</bean>

</beans>

spring-cache.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:cache="http://www.springframework.org/schema/cache"
	xsi:schemaLocation="http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.3.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	<description>配置缓存管理</description>

	<!-- 配置缓存管理 -->
	<cache:annotation-driven cache-manager="cacheManager" />

	<!-- 加载ehcache -->
	<bean id="ehcacheManager"
		class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
		lazy-init="true">
		<property name="configLocation" value="classpath:cache/ehcache.xml"></property>
		<!-- 由于hibernate也使用了Ehcache, shared保证双方都使用同一个缓存管理器,同时hibernate需要 使用SingletonEhCacheRegionFactory管理缓存 -->
		<property name="shared" value="true" />
	</bean>

	<!-- hibernate的缓存管理 -->
	<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"
		lazy-init="true">
		<property name="cacheManager" ref="ehcacheManager" />
		<property name="transactionAware" value="true" />
	</bean>

	<!-- shiro的缓存管理 -->
	<bean id="shiroCacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"
		lazy-init="true">
		<property name="cacheManager" ref="ehcacheManager" />
	</bean>

</beans>

db.properties

#数据源one-(master)
dbOne.jdbc.driverClass=com.mysql.jdbc.Driver
dbOne.jdbc.url=jdbc:mysql://127.0.0.1:3306/shiro_ex?useUnicode=true&characterEncoding=UTF8
dbOne.jdbc.user=root
dbOne.jdbc.password=1234
dbOne.jdbc.initialPoolSize=5
dbOne.jdbc.minPoolSize=5
dbOne.jdbc.maxPoolSize=15


logback.xml
<?xml version="1.0"?>

<!-- 从高到地低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->
<!-- 日志输出规则 根据当前ROOT 级别,日志输出时,级别高于root默认的级别时会输出 -->
<!-- 以下每个配置的 filter 是过滤掉输出文件里面,会出现高级别文件,依然出现低级别的日志信息,通过filter 过滤只记录本级别的日志 -->
<!-- 看是console还是file主要是看ConsoleAppender和RollingFileAppender -->

<!-- 属性描述 scan:性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- 当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- 属性描述 scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。 -->
<!-- 属性描述 debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="false" scanPeriod="60" debug="false">
	<!-- 定义日志文件 输入位置,这个是全局变量,方便调用重复 -->
	<!-- 使用/是绝对路径,没有就是使用相对路径 -->
	<property name="log_dir" value="d:/ex/logback" />
	<!-- 日志最大的历史 30天 ,这个是全局变量,方便调用重复 -->
	<property name="maxHistory" value="30" />

	<!-- 配置控制台日志输出 -->
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
		<!-- 对日志进行格式化 -->
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n
			</pattern>
		</encoder>
	</appender>

	<!-- 配置文件日志输出,所有级别都输出 -->
	<appender name="file"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<Encoding>UTF-8</Encoding>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 设置文件位置 -->
			<FileNamePattern>${log_dir}/allLevel/clever-log-%d{yyyy-MM-dd_HH}.log
			</FileNamePattern>
			<!-- 设置文件存活时间 -->
			<maxHistory>${maxHistory}</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n
			</pattern>
		</encoder>
	</appender>

	<!-- ERROR级别日志 -->
	<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 RollingFileAppender -->
	<appender name="error"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<Encoding>UTF-8</Encoding>
		<!-- 过滤器,只记录WARN级别的日志 -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>ERROR</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
		<!-- 最常用的滚动策略,它根据时间来制定滚动策略.既负责滚动也负责出发滚动 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!--日志输出位置 可相对、和绝对路径 -->
			<fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/error-log.log
			</fileNamePattern>
			<!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件假设设置每个月滚动,且<maxHistory>是6, 则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除 -->
			<maxHistory>${maxHistory}</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n
			</pattern>
		</encoder>
	</appender>

	<!-- WARN级别日志 appender -->
	<appender name="warn"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<Encoding>UTF-8</Encoding>
		<!-- 过滤器,只记录WARN级别的日志 -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>WARN</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 按天回滚 daily -->
			<fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/warn-log.log
			</fileNamePattern>
			<!-- 日志最大的历史 60天 -->
			<maxHistory>${maxHistory}</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n
			</pattern>
		</encoder>
	</appender>

	<!-- INFO级别日志 appender -->
	<appender name="info"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<Encoding>UTF-8</Encoding>
		<!-- 过滤器,只记录INFO级别的日志 -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>INFO</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 按天回滚 daily -->
			<fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/info-log.log
			</fileNamePattern>
			<!-- 日志最大的历史 60天 -->
			<maxHistory>${maxHistory}</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n
			</pattern>
		</encoder>
	</appender>

	<!-- DEBUG级别日志 appender -->
	<appender name="debug"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<Encoding>UTF-8</Encoding>
		<!-- 过滤器,只记录DEBUG级别的日志 -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>DEBUG</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 按天回滚 daily -->
			<fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/debug-log.log
			</fileNamePattern>
			<!-- 日志最大的历史 60天 -->
			<maxHistory>${maxHistory}</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n
			</pattern>
		</encoder>
	</appender>

	<!-- TRACE级别日志 appender -->
	<appender name="trace"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<Encoding>UTF-8</Encoding>
		<!-- 过滤器,只记录ERROR级别的日志 -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>TRACE</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 按天回滚 daily -->
			<fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/trace-log.log
			</fileNamePattern>
			<!-- 日志最大的历史 60天 -->
			<maxHistory>${maxHistory}</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n
			</pattern>
		</encoder>
	</appender>

	<!-- name:用来指定受此loger约束的某一个包或者具体的某一个类 -->
	<!-- addtivity:是否向上级loger传递打印信息。默认是true。 -->
	<!-- level:用来设置打印级别,大小写无关 -->
	<!-- appender-ref:标识使用哪个appender将会添加到这个loger -->
	<!-- 精确设置每个包下面的日志 -->
	<logger name="com.szhis.frsoft" additivity="false">
		<!-- 指定最低日志级别 -->
		<level value="info" />
		<appender-ref ref="console" />
		<appender-ref ref="file" />
	</logger>
	<logger name="java.sql.PreparedStatement" additivity="false">
		<level value="debug"></level>
		<appender-ref ref="console" />
		<appender-ref ref="debug" />
	</logger>
	<logger name="java.sql" additivity="false">
		<level value="info"></level>
		<appender-ref ref="console" />
		<appender-ref ref="info" />
	</logger>
	<logger name="org.springframework" additivity="false">
		<level value="info"></level>
		<appender-ref ref="console" />
		<appender-ref ref="info" />
	</logger>

	<!-- root也是<loger>元素,但是它是根loger,只有一个level属性,应为已经被命名为"root" -->
	<!-- 这里是默认配置,没有配置就使用默认配置 -->
	<root level="info">
		<!-- 控制台输出 -->
		<appender-ref ref="console" />
		<!-- 文件输出 -->
		<appender-ref ref="info" />
	</root>

</configuration>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<!-- 加载spring配置文件 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:spring/spring-context.xml</param-value>
	</context-param>

	<!-- 配置字符编码过滤器 -->
	<!-- 字符编码过滤器必须配置在所有过滤器的最前面! -->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<!-- filter-name过滤名必须与springbeanId名相同 -->
	<filter>
		<filter-name>shiroFilter</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
		<init-param>
			<!-- 该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由ServletContainer管理 -->
			<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>

	<!-- 配置启动 IOC 容器的 Listener -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- 配置 SpringMVC 的 DispatcherServlet -->
	<servlet>
		<servlet-name>springDispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- 不配置此参数,默认加载/WEB-INF.xml/springDispatcherServlet-servlet.xml文件 -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring-mvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springDispatcherServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>
</web-app>
spring-mvc.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:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	<!-- springMVC容器,只需要扫描自己需要的bean其他的不需要托管 -->

	<!--1:开始springMVC注解模式 -->
	<!--简化配置: 1.1自动注册DefaultAnnotationHandlerMapping,AnnotationMethodHandlerAdapter -->
	<!--1.2提供一系列:数据绑定,数字和日期的format,@NumberFormat,@DataTimeFormat,xml,json默认读写支持 -->
	<mvc:annotation-driven />

	<!--2:静态资源默认servlet配置 ①加入对静态资源的处理:js,css,gif,png ②允许使用"/"做整体映射 -->
	<mvc:default-servlet-handler />

	<!-- 配置视图解析器 -->
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>

	<!-- 配置自动扫描的包 -->
	<context:component-scan base-package="com.szhis.frsoft.web"
		use-default-filters="false">
		<context:include-filter type="annotation"
			expression="org.springframework.stereotype.Controller" />
		<context:include-filter type="annotation"
			expression="org.springframework.web.bind.annotation.ControllerAdvice" />
	</context:component-scan>

	<!-- 支持上传文件 -->
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="defaultEncoding" value="utf-8" />
		<property name="maxUploadSize" value="104857600" />
		<property name="maxInMemorySize" value="4096" />
	</bean>

</beans>

UserRealm.java

package com.szhis.frsoft.common.shiro;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;

import com.szhis.frsoft.entity.user.User;
import com.szhis.frsoft.service.UserService;

public class UserRealm extends AuthorizingRealm {
	@Autowired
	private UserService userService;

	/**
	 * Authorization 授权
	 * principal 当事人
	 * @see org.apache.shiro.realm.AuthorizingRealm#doGetAuthorizationInfo(org.apache.shiro.subject.PrincipalCollection)
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) {
		return null;
	}

	/**
	 * Authentication 认证
	 * @see org.apache.shiro.realm.AuthenticatingRealm#doGetAuthenticationInfo(org.apache.shiro.authc.AuthenticationToken)
	 */
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		String usercode = (String) token.getPrincipal();
		User src = userService.findByUsercode(usercode);
		if (src != null) {
			ByteSource salt = ByteSource.Util.bytes(src.getSalt());
			return new SimpleAuthenticationInfo(src, src.getUserpass(), salt, getName());
		}
		return null;
	}

}

先占时写这么点东西

最后给代码文件(只是部分,这些代码不能跑起来,毕竟是公司的东西,只能给一些心得)
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值