这个是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;
}
}
先占时写这么点东西
最后给代码文件(只是部分,这些代码不能跑起来,毕竟是公司的东西,只能给一些心得)