一,SessionManager和SessionDAO
第一步:引入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
第二步:新增Redis配置文件
<?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">
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg ref="jedisPoolConfig" />
<constructor-arg value="127.0.0.1" type="java.lang.String" />
<constructor-arg value="6379" />
</bean>
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" />
</beans>
第三步:在spring配置文件导入Redis配置文件
<import resource="spring-redis.xml" />
第四步:创建SessionDAO继承AbstractSessionDAO
package com.lmc.session;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.UnknownSessionException;
import org.apache.shiro.session.mgt.eis.AbstractSessionDAO;
import org.springframework.util.SerializationUtils;
import javax.annotation.Resource;
import java.io.Serializable;
import java.util.Collection;
/**
* @Author lmc
* @Description
* @Date: Create in 19:52 2020/2/1
*/
public class RedisSessionDao extends AbstractSessionDAO {
@Override
protected Serializable doCreate(Session session) {
return null;
}
@Override
protected Session doReadSession(Serializable serializable) {
return null;
}
@Override
public void update(Session session) throws UnknownSessionException {
}
@Override
public void delete(Session session) {
}
@Override
public Collection<Session> getActiveSessions() {
return null;
}
}
第五步:重写SessionDAO
package com.lmc.session;
import com.lmc.util.JedisUtil;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.UnknownSessionException;
import org.apache.shiro.session.mgt.eis.AbstractSessionDAO;
import org.springframework.util.CollectionUtils;
import org.springframework.util.SerializationUtils;
import javax.annotation.Resource;
import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
/**
* @Author lmc
* @Description
* @Date: Create in 19:52 2020/2/1
*/
public class RedisSessionDao extends AbstractSessionDAO {
@Resource
private JedisUtil jedisUtil;
private final String shiro_session_prefix = "lmc-session:";
private byte[] getKey(String sessionId){
return (shiro_session_prefix + sessionId).getBytes();
}
//保存session
private void saveSession(Session session) {
if (session != null && session.getId() != null) {
byte[] key = getKey(session.getId().toString());
byte[] value = SerializationUtils.serialize(session);
jedisUtil.set(key, value);
jedisUtil.expire(key, 300);//单位:秒
}
}
@Override
protected Serializable doCreate(Session session) {
Serializable sessionId = generateSessionId(session);
//将session和sessionId进行捆绑
assignSessionId(session, sessionId);
saveSession(session);
return sessionId;
}
@Override
protected Session doReadSession(Serializable serializable) {
if (serializable == null) {
return null;
}
byte[] key = getKey(serializable.toString());
byte[] value = jedisUtil.get(key);
//反序列化
return (Session) SerializationUtils.deserialize(value);
}
@Override
public void update(Session session) throws UnknownSessionException {
saveSession(session);
}
@Override
public void delete(Session session) {
if (session != null && session.getId() != null) {
return;
}
byte[] key = getKey(session.getId().toString());
jedisUtil.delete(key);
}
@Override
public Collection<Session> getActiveSessions() {
Set<byte[]> keys = jedisUtil.keys(shiro_session_prefix);
Set<Session> sessions = new HashSet<>();
if (CollectionUtils.isEmpty(keys)) {
return sessions;
}
for (byte[] key: keys) {
Session session = (Session) SerializationUtils.deserialize(jedisUtil.get(key));
sessions.add(session);
}
return sessions;
}
}
JedisUtil:
package com.lmc.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import javax.annotation.Resource;
import java.util.Set;
/**
* @Author lmc
* @Description Redis访问工具
* @Date: Create in 19:54 2020/2/1
*/
@Component
public class JedisUtil {
@Autowired
private JedisPool jedisPool;
//获得连接
private Jedis getResource(){
return jedisPool.getResource();
}
public byte[] set(byte[] key, byte[] value) {
Jedis jedis = getResource();
try {
jedis.set(key, value);
return value;
} finally {
jedis.close();
}
}
public void expire(byte[] key, int i) {
Jedis jedis = getResource();
try {
jedis.expire(key, i);
} finally {
jedis.close();
}
}
public byte[] get(byte[] key) {
Jedis jedis = getResource();
try {
return jedis.get(key);
} finally {
jedis.close();
}
}
public void delete(byte[] key) {
Jedis jedis = getResource();
try {
jedis.del(key);
} finally {
jedis.close();
}
}
public Set<byte[]> keys(String shiro_session_prefix) {
Jedis jedis = getResource();
try {
return jedis.keys((shiro_session_prefix + "*").getBytes());
} finally {
jedis.close();
}
}
}
第六步:编辑spring.xml
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="userRealm" />
<property name="sessionManager" ref="sessionManager" />
</bean>
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<property name="sessionDAO" ref="redisSessionDao" />
</bean>
<bean id="redisSessionDao" class="com.lmc.session.RedisSessionDao"/>
注意:成功运行的前提是要开启Redis服务器
二,Redis实现Session共享
由于DefaultWebSessionManager设置每次访问都要去SessionDAO获取session,这样运行的效率不高,已存在的session通过request来获取更符合常规,可以重写DefaultWebSessionManager的retrieveSession方法来实现此过程。
CustomSessionManage:
package com.lmc.session;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.UnknownSessionException;
import org.apache.shiro.session.mgt.SessionKey;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.apache.shiro.web.session.mgt.WebSessionKey;
import javax.servlet.ServletRequest;
import java.io.Serializable;
/**
* @Author lmc
* @Description
* @Date: Create in 17:43 2020/2/2
*/
public class CustomSessionManage extends DefaultWebSessionManager {
@Override
protected Session retrieveSession(SessionKey sessionKey) throws UnknownSessionException {
//获取sessionID
Serializable sessionId = getSessionId(sessionKey);
ServletRequest request = null;
if (sessionKey instanceof WebSessionKey) {
request = ((WebSessionKey) sessionKey).getServletRequest();
}
//若request中有该session,则从request获取
if (request != null && sessionId != null) {
Session s = (Session) request.getAttribute(sessionId.toString());
if (s != null) {
return s;
}
}
Session session = super.retrieveSession(sessionKey);
if (request != null && sessionId != null){
request.setAttribute(sessionId.toString(), session);
}
return session;
}
}
还要重写修改spring.xml:
<bean id="sessionManager" class="com.lmc.session.CustomSessionManage">
<property name="sessionDAO" ref="redisSessionDao" />
</bean>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/81650.html