1.如果没有集成shiro来管理session,可以直接使用spring-session

2.若集成了shiro,需要Spring-data-redis (或 shiro-redis)

3.nginx设置

  a.下载nginx

  b.解压后,在conf目录下修改nginx.conf文件,配置反向代理

    upstream tomcat_server{server localhost:8080;}upstream tomcat_server2{server localhost:8081;}server {listen       80;server_name  localhost;location /blogproject {proxy_pass http://tomcat_server;}location /testnginx {proxy_pass http://tomcat_server2;}#location / {#    proxy_pass http://tomcat_server;#}
error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}

  c.在nginx根目录下打开cmd界面(shift+鼠标右键,选择在此处打开命令窗口)

  d.nginx指令启动nginx:

#启动
start nginx#快速停止
nginx -s stop#正常停止
nginx -s quit#重装载
nginx -s reload

4.安装redis

  a.由于官方是没有Windows版的,所以我们需要下载微软开发的redis,网址:https://github.com/MicrosoftArchive/redis/releases

  b.解压后,在redis根目录打开cmd界面,输入:redis-server.exe redis.windows.conf,启动redis(关闭cmd窗口即停止)

5.shiro整合redis

  a.导入依赖

    <dependency>  <groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>1.4.1.RELEASE</version></dependency>  <dependency>  <groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.5.2</version></dependency> 

  b.新建spring-redis.xml 和 redis.properties

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans-4.3.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.3.xsd"><bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"><property name="maxIdle" value="${redis.maxIdle}"></property><property name="maxTotal" value="${redis.maxTotal}"></property><property name="maxWaitMillis" value="${redis.maxWaitMillis}"></property><property name="testOnBorrow" value="${redis.testOnBorrow}"></property></bean><bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"><property name="usePool" value="${redis.pooled}"></property><property name="hostName" value="${redis.host}"></property><property name="port" value="${redis.port}"></property><property name="poolConfig" ref="jedisPoolConfig"></property></bean><bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"><property name="connectionFactory" ref="jedisConnectionFactory"></property><property name="keySerializer"><bean class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean></property><!-- 解决读取int类型value值报错的问题 --><property name="valueSerializer"><bean class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean></property><property name="hashKeySerializer"><bean class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean></property></bean></beans>

redis.host=localhost
redis.port=6379
redis.maxIdle=30
redis.maxTotal=100
redis.maxWaitMillis=1000
redis.testOnBorrow=true
redis.pooled=true

  注意:redis.properties 需要用 <context:property-placeholder /> 导入,但是全xml有且仅能有有个<context:property-placeholder />

<!-- 导入配置文件 --><context:property-placeholder location="classpath:jdbc.properties,classpath:solr.properties,classpath:redis.properties"/> 

  c.新建类RedisManager

@Component
public class RedisManager {@Resourceprivate RedisTemplate<String, Session> redisTemplate;private static final String KEY = "shareSessionMap";public void hadd(String sessionId, byte[] bytes){redisTemplate.boundHashOps(KEY).put(sessionId, bytes);}public void hadd(String sessionId, Session session){redisTemplate.boundHashOps(KEY).put(sessionId, session);}public void hdelete(String sessionId){redisTemplate.boundHashOps(KEY).delete(sessionId);}public Session hget(String sessionId){return (Session) redisTemplate.boundHashOps(KEY).get(sessionId);}public List<Session> hmget(){List<Session> list = new ArrayList<Session>();List<Object> values = redisTemplate.boundHashOps(KEY).values();for (Object object : values) {list.add((Session) object);}return list;}
}

  d.新建类SessionDao,继承AbstractSessionDAO,重写方法

@Component
public class SessionDao extends AbstractSessionDAO {@Resourceprivate RedisManager redisManager;@Overridepublic void delete(Session session) {if(session == null || session.getId() == null){System.out.println("Session为空");return;}redisManager.hdelete(session.getId().toString());}@Overridepublic Collection<Session> getActiveSessions() {List<Session> list = redisManager.hmget();return list;}@Overridepublic void update(Session session) throws UnknownSessionException {if(session == null || session.getId() == null){System.out.println("Session为空");return;}Serializable sessionId = session.getId();redisManager.hadd(sessionId.toString(), session);}@Overrideprotected Serializable doCreate(Session session) {Serializable sessionId = generateSessionId(session);assignSessionId(session, sessionId);//添加进redis
        redisManager.hadd(sessionId.toString(), session);return sessionId;}@Overrideprotected Session doReadSession(Serializable sessionId) {return redisManager.hget(sessionId.toString());}}

  e.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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.3.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.3.xsd"><!-- 使用spring组件扫描@service  --><context:component-scan base-package="com.wode.service"/><!-- 自定义域realm --><bean id="custom_Realm" class="com.wode.realm.CustomRealm"><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><!-- 安全管理器  ref对象--><bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"><property name="realm" ref="custom_Realm"/><!-- session管理 --><property name="sessionManager" ref="sessionManager"></property></bean><!-- shiro filter --><bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><!-- 安全管理器必须的 --><property name="securityManager" ref="securityManager"/><!-- 身份认证失败   认证提交的地址 --><property name="loginUrl" value="/"/><!-- 权限认证失败    没有权限认证提交的地址 --><property name="unauthorizedUrl" value="/unauthorized"/><!-- Shiro连接约束配置,即过滤链的定义 --><property name="filterChainDefinitions"><value><!-- 对静态资源设置匿名访问 -->/ = anon/login = anon/go2RegisterPage = anon/register = anon/static/** = anon<!-- 必须要管理员角色才能访问 -->/admin/** = roles[admin]<!-- 所有url都必须认证通过才可以访问 -->/** = authc</value></property></bean><!-- Shiro生命周期处理器 --><bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"></bean><bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"><property name="securityManager" ref="securityManager"/></bean><!-- Session ID 生成器 --><bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"></bean><!-- SessionDao实现类 --><bean id="sessionDAO" class="com.wode.session.SessionDao"><property name="sessionIdGenerator" ref="sessionIdGenerator"></property></bean><!-- session管理 --><bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"><property name="globalSessionTimeout" value="1800000"></property><property name="deleteInvalidSessions" value="true"></property><property name="sessionDAO" ref="sessionDAO"></property><!-- sessionIdCookie的实现,用于重写覆盖容器默认的JSESSIONID --><property name="sessionIdCookie" ref="sharesession" /></bean><!-- sessionIdCookie的实现,用于重写覆盖容器默认的JSESSIONID --><bean id="sharesession" class="org.apache.shiro.web.servlet.SimpleCookie"><!-- cookie的name,对应的默认是 JSESSIONID --><constructor-arg name="name" value="SHAREJSESSIONID" /><!-- jsessionId的path为 / 用于多个系统共享jsessionId --><property name="path" value="/" /><property name="httpOnly" value="true"/></bean></beans>

参考链接:https://www.cnblogs.com/LUA123/p/7728319.html

转载于:https://www.cnblogs.com/vettel0329/p/8403767.html

分布式session解决——Spring-data-redis相关推荐

  1. 【分布式-session】spring boot + redis 实现session共享

    1 为何需要Session共享? 因为每个应用容器默认是将Session存储在本地内存,仅容器本身可以访问,但是在分布式集群中,包含多个应用容器,一个用户请求会随机发送到容器上,比如,用户在A容器登陆 ...

  2. 使用客户端jedis时报错Could not get a resource from the pool 以及使用Spring Data Redis报错解决方法

    一.Jedis 报错 今天在使用jedis时,一直报错 Could not get a resource from the pool 在网上找了好多解决的方法,并且找了半天错误,才发现是我的启动方式有 ...

  3. Redis - Spring Data Redis 操作 Jedis 、Lettuce 、 Redisson

    文章目录 官网 Jedis VS Lettuce Jedis Code POM依赖 配置文件 配置类 单元测试 Lettuce Code Redisson Code POM依赖 配置文件 配置类 单元 ...

  4. Spring Data Redis 正确使用姿势

    课程简介 本课程主要讲解常规 Redis 的写法,Redis 和 Spring 的结合使用,即 Spring Data Redis,以及 Redis 在工作中的正确使用姿势,Redis 和 Sprin ...

  5. 使用Spring Data Redis操作Redis(集群版)

    说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点.并且会与一些低版本的Sp ...

  6. Spring Boot使用Spring Data Redis操作Redis(单机/集群)

    说明:Spring Boot简化了Spring Data Redis的引入,只要引入spring-boot-starter-data-redis之后会自动下载相应的Spring Data Redis和 ...

  7. Java Spring Data Redis实战与配置参数详解 application.properties...

    Redis作为开源分布式高并发缓存,使用范围非常广泛,主流互联网公司几乎都在使用. Java Spring Boot 2.0实战开发Redis缓存可以参考下面的步骤,Redis安装可以直接使用Linu ...

  8. Spring Data Redis—Pub/Sub(附Web项目源码)

    一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...

  9. 使用Spring Data Redis进行缓存

    在下面的示例中,我将向您展示如何使用Spring Data – Redis项目作为Spring 3.1中引入的Spring Cache Abstraction的缓存提供程序. 我对如何使用Spring ...

  10. Spring Data Redis 让 NoSQL 快如闪电(2)

    2019独角兽企业重金招聘Python工程师标准>>> 把 Redis 当作数据库的用例 现在我们来看看在服务器端 Java 企业版系统中把 Redis 当作数据库的各种用法吧.无论 ...

最新文章

  1. 如何通过 Scratch 教小朋友编程思维?
  2. 1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区(题解第二弹)
  3. 修改jupyter的保存位置
  4. Mac下制作Ubuntu的启动U盘
  5. shell 脚本编程之for语句、if语句(2 )
  6. [Qt入门]QTreeWidget控件创建
  7. 资金时间价值的计算机应用视频讲解,第八章资金时间价值与方案经济比选20161018讲解.ppt...
  8. Spring Cloud限流详解(内含源码)
  9. 苹果推送watchOS 5.3.2更新:用户无需升级至iOS13也可使用
  10. php 查询和redis,php如何查询redis
  11. 【笔试/面试】—— 数组中第二大的数
  12. JQuery动态增加删除元素
  13. java gps解析_GPS经纬度可以用来Java解析
  14. 基于openoffice+pdfobject.js实现文档上传以及在线预览功能
  15. 机器学习-数据科学库-day4
  16. Jmeter Ant Jenkins报告优化——jmeter.results.shanhe.me模板的response和request值为空的解决方案
  17. layui前端项目打包方法_layui封装模块基础教程
  18. 算法导论之排序算法(1)
  19. hashtable的解释
  20. 711问题-优化蛮力求解

热门文章

  1. L1-021 重要的话说三遍 (5 分) 含解题思路 C语言
  2. 输出华氏-摄氏温度转换表
  3. 小布机器人怎么断网_小布同学智能机器人好坏判断有诀窍,三大误区要避免
  4. 【MAC、Windows系统的node版本管理工具——nvm】nvm的安装、nvm常用命令、nvm设置默认 node 版本
  5. 对脏写、脏读、不可重复度、幻读的理解笔记
  6. 【建议收藏】17个XML布局小技巧
  7. java小游戏之飞机大战
  8. 骂人的c语言,法语中骂人你就只会Merde?
  9. Progressive Minimal Path Method for Segmentation of 2D and 3D Line Structures论文学习
  10. 详细介绍 Node.js