利用redis解决:
默认已安装redis
引入jar包
compile group: 'org.springframework.session', name: 'spring-session-data-redis', version: '1.3.1.RELEASE'// https://mvnrepository.com/artifact/biz.paluch.redis/lettuce compile group: 'biz.paluch.redis', name: 'lettuce', version: '4.4.2.Final'
redis.properties
redis_hostName = localhost redis_port = 6379 redis_password = redis_timeout = 3600 redis.maxIdle=300 redis.maxActive=600 redis.maxWait=1000 redis.testOnBorrow=truespring.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" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd "> <!-- 注解支持 --> <context:annotation-config /> <!-- 启动组件扫描,排除@Controller组件,该组件由SpringMVC配置文件扫描 .service--> <context:component-scan base-package="com.xping"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> <!-- 引入属性文件(多个) --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:dbConfig.properties</value> <value>classpath:redis.properties</value> </list> </property> </bean> <import resource="spring-mybatis.xml"/> <import resource="spring-redis.xml"/> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver" /> </beans>spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> <!--开启注解 --> <mvc:annotation-driven/> <!-- springmvc传json值时的乱码解决 --> <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>application/json;charset=UTF-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> <!-- 自动扫描controller包下的所有类,使其认为spring mvc的控制器 --> <context:component-scan base-package="com.xping.controller"/> <!-- 定义跳转的文件的前后缀 ,视图模式配置 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--路径的前缀--> <property name="prefix" value="/WEB-INF/views/"/> <!--路径的后缀--> <property name="suffix" value=".jsp"/> </bean> <!-- 文件上传配置 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 默认编码 --> <property name="defaultEncoding" value="UTF-8"/> <!-- 上传文件大小限制为31M,31*1024*1024 --> <property name="maxUploadSize" value="32505856"/> <!-- 内存中的最大值 --> <property name="maxInMemorySize" value="4096"/> </bean> <!--日期格式转换器--> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="com.xping.utils.StringToDateConverter"> <constructor-arg name="datePattern" value="yyyy-MM-dd"/> </bean> </set> </property> </bean> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="defaultEncoding" value="UTF-8"/> <property name="useCodeAsDefaultMessage" value="true" /> <!-- 国际化资源文件名 --> <property name="basenames"> <list> <value>language.about</value> <value>language.header</value> <value>language.login</value> <value>language.footer</value> <value>language.page_404</value> <value>language.home</value> </list> </property> </bean> <mvc:interceptors> <!--<mvc:interceptor>--> <!--<mvc:mapping path="/**"/>--> <!--<bean class="com.xpingg.interceptor.CSRFInterceptor"/>--> <!--</mvc:interceptor>--> <!-- 国际化操作拦截器 如果采用基于(Session/Cookie)则必需配置 --> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/> </mvc:interceptor> <mvc:interceptor> <!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller --> <!--拦截go后缀 不拦截py后缀--> <mvc:mapping path="/*.go" /> <!--资源不拦截--> <!--<mvc:exclude-mapping path="/**/*login*"/>--> <!--<mvc:exclude-mapping path="/**/*Login*"/>--> <!-- /register 和 /login 不需要拦截--> <!--<mvc:exclude-mapping path="/index.py" />--> <bean class="com.xping.interceptor.LoginInterceptor"> <!--定义拦截后重定向到默认的登录处理页面 --> <property name="defultLogin" value="/noAuth.py" /> </bean> </mvc:interceptor> <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 --> </mvc:interceptors> <!-- AcceptHeaderLocaleResolver 配置,因为AcceptHeaderLocaleResolver是默认语言区域解析器,不配置也可以 这里我用我修改过的解析器 --> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"> <property name="defaultLocale" value="zh_CN"/> </bean> <!--将静态资源交由默认的servlet处理--> <mvc:default-servlet-handler/> <!--重要!将你的SwaggerConfig配置类注入--> <bean class="com.xping.config.SwaggerConfig"/> </beans>spring-redis.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- session设置 --> <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"> <property name="maxInactiveIntervalInSeconds" value="3600"/> </bean> <!-- redis连接池 --> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxIdle" value="${redis.maxIdle}" /> <property name="maxTotal" value="${redis.maxActive}" /> <property name="maxWaitMillis" value="${redis.maxWait}" /> <property name="testOnBorrow" value="${redis.testOnBorrow}" /> </bean> <!-- redis连接工厂 --> <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="${redis_hostName}"/> <property name="port" value="${redis_port}"/> <property name="password" value="${redis_password}"/> <property name="timeout" value="${redis_timeout}"/> <property name="poolConfig" ref="poolConfig"/> </bean> <!--session--> <bean class="org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory"/> <!-- 使用中间类解决RedisCache.jedisConnectionFactory的静态注入,从而使MyBatis实现第三方缓存 --> <bean id="redisCacheTransfer" class="com.xping.utils.RedisCache.RedisCacheTransfer"> <property name="jedisConnectionFactory" ref="connectionFactory"/> </bean> <!--配置Redis字符串运行环境--> <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/> <!--配置redisTemplate--> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="connectionFactory"/> <property name="keySerializer" ref="stringRedisSerializer"/> <property name="valueSerializer" ref="stringRedisSerializer"/> </bean> </beans>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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>AoShop</display-name> <servlet> <servlet-name>DruidStatView</servlet-name> <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class> <init-param> <param-name>allow</param-name> <param-value>127.0.0.1</param-value> </init-param> <init-param> <param-name>deny</param-name> <param-value>192.168.1.118</param-value> </init-param> <!-- 在StatViewSerlvet输出的html页面中,有一个功能是Reset All,执行这个操作之后,会导致所有计数器清零,重新计数 --> <init-param> <param-name>resetEnable</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>loginUsername</param-name> <param-value>lmy</param-value> </init-param> <init-param> <param-name>loginPassword</param-name> <param-value>165177</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DruidStatView</servlet-name> <url-pattern>/druid/*</url-pattern> </servlet-mapping> <!-- Spring 服务层的配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring.xml</param-value> </context-param> <!-- spring监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 防止spring内存溢出监听器,比如quartz --> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <!-- 前端控制器--> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--加载springmvc的配置问文件--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <async-supported>true</async-supported> </servlet> <!-- 第一种:*.action 以.action结尾的由DispatcherServlet进行解析 第二种:/所有访问地址都由DispatcherServlet解析,对于静态文件的解析需要配置不让DispatcherServlet解析。使用此种方式可以实现RESTful风格的url 第三种:/*,这样配置不对,使用这种配置,最终要转发到一个jsp页面时,仍然会由DispatcherServlet进行解析jsp地址,它不能根据jsp页面找到Handler,会报错--> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <!-- 此处也可以配置成 *.do 形式 --> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 浏览器不支持put,delete等method,由该filter将/xxx?_method=delete转换为标准的http delete方法 --> <filter> <filter-name>hiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>hiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>/index.jsp</welcome-file> </welcome-file-list> <!-- 配置Spring字符编码过滤器 --> <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> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--错误页面设置--> <error-page> <error-code>403</error-code> <location>/WEB-INF/views/page_404.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/WEB-INF/views/page_404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/WEB-INF/views/page_404.jsp</location> </error-page> <filter> <filter-name>springSessionRepositoryFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSessionRepositoryFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping> </web-app>