本文实例讲述了Java简单实现session保存到redis的方法。分享给大家供大家参考,具体如下:
在负载均衡情况下,如果用户访问不同的机器,如果没有做session同步,用户就会被提出,这样用户体验非常不好,所以我们很有必要做session同步,把session放到reids缓存服务器就能很好的解决问题。下面是代码简单的实现。
一、配置web.xml过滤器:
1
2
3
4
5
6
7
8
|
< filter >
< filter-name >sessionFilter</ filter-name >
< filter-class >org.springframework.web.filter.DelegatingFilterProxy</ filter-class >
</ filter >
< filter-mapping >
< filter-name >sessionFilter</ filter-name >
< url-pattern >/*</ url-pattern >
</ filter-mapping >
|
二、配置对应的过滤器名字:
1
2
3
|
< bean id = "sessionFilter" class = "com.plateno.interceptor.SessionFilter" >
< property name = "redisTemplate" ref = "redisTemplate" />
</ bean >
|
三、SessionFilter的实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public class SessionFilter extends GenericFilterBean {
private RedisTemplate redisTemplate;
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println( "filter" );
HttpServletRequest re = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
TerryHttpServletRequestWrapper wrapper = new TerryHttpServletRequestWrapper(re,res,redisTemplate);
chain.doFilter(wrapper, response);
}
public RedisTemplate getRedisTemplate() {
return redisTemplate;
}
public void setRedisTemplate(RedisTemplate redisTemplate) {
this .redisTemplate = redisTemplate;
}
}
|
四、TerryHttpServletRequestWrapper的实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
public class TerryHttpServletRequestWrapper extends HttpServletRequestWrapper {
private CacheHttpSession session;
private HttpServletResponse response;
private RedisTemplate redisTemplate;
public TerryHttpServletRequestWrapper(HttpServletRequest request, HttpServletResponse response,RedisTemplate redisTemplate) {
super (request);
this .response = response;
this .redisTemplate = redisTemplate;
}
@Override
public HttpSession getSession( boolean create) {
if (session != null ) {
return session;
}
String sid = "terry" + System.currentTimeMillis();
writeSidToCookie(sid);
session = new CacheHttpSession( null ,sid,redisTemplate);
return session;
}
@Override
public HttpSession getSession() {
return getSession( false );
}
protected void writeSidToCookie(String sid) {
Cookie mycookies = new Cookie( "terry" , sid);
mycookies.setMaxAge(- 1 );
mycookies.setDomain( "locahost" );
mycookies.setPath( "/" );
response.addCookie(mycookies);
}
}
|
五、CacheHttpSession的实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
public class CacheHttpSession extends HttpSessionWrapper {
private String sid;
private RedisTemplate redisTemplate;
private StringRedisSerializer stringSerializer = new StringRedisSerializer();
public CacheHttpSession(HttpSession session,String sid,RedisTemplate redisTemplate) {
super (session);
this .sid = sid;
this .redisTemplate = redisTemplate;
}
@SuppressWarnings ( "unchecked" )
@Override
public Enumeration<String> getAttributeNames() {
final byte [] key = stringSerializer.serialize(sid);
Object result = redisTemplate.execute( new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection)
throws DataAccessException {
Set< byte []> set = connection.keys(key);
return set;
}
});
if (result != null ) {
Set< byte []> s = (Set< byte []>)result;
Set<String> ss = new HashSet<String>();
for ( byte [] b : s) {
ss.add(stringSerializer.deserialize(b));
}
Enumeration<String> en = new Vector(ss).elements();
return en;
}
return null ;
}
@SuppressWarnings ( "unchecked" )
@Override
public void setAttribute(String name, Object value) {
final byte [] key = stringSerializer.serialize(name);
final byte [] v = stringSerializer.serialize((String)value);
redisTemplate.execute( new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection)
throws DataAccessException {
connection.set(key, v);
return null ;
}
});
}
@Override
public Object getAttribute(String name) {
final byte [] key = stringSerializer.serialize(name);
@SuppressWarnings ( "unchecked" )
Object value = redisTemplate.execute( new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection)
throws DataAccessException {
return connection.get(key);
}
});
return value;
}
@Override
public String getId() {
return sid;
}
}
|
六、HttpSessionWrapper的实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
public class HttpSessionWrapper implements HttpSession {
private HttpSession session;
public HttpSessionWrapper(HttpSession session) {
this .session = session;
}
@Override
public long getCreationTime() {
return this .session.getCreationTime();
}
@Override
public String getId() {
return this .session.getId();
}
@Override
public long getLastAccessedTime() {
return this .session.getLastAccessedTime();
}
@Override
public ServletContext getServletContext() {
return this .session.getServletContext();
}
@Override
public void setMaxInactiveInterval( int interval) {
this .session.setMaxInactiveInterval(interval);
}
@Override
public int getMaxInactiveInterval() {
return this .session.getMaxInactiveInterval();
}
@Override
public HttpSessionContext getSessionContext() {
return this .session.getSessionContext();
}
@Override
public Object getAttribute(String name) {
return this .session.getAttribute(name);
}
@Override
public Object getValue(String name) {
return this .session.getValue(name);
}
@Override
public Enumeration<String> getAttributeNames() {
return this .session.getAttributeNames();
}
@Override
public String[] getValueNames() {
return this .session.getValueNames();
}
@Override
public void setAttribute(String name, Object value) {
this .session.setAttribute(name,value);
}
@Override
public void putValue(String name, Object value) {
this .session.putValue(name,value);
}
@Override
public void removeAttribute(String name) {
this .session.removeAttribute(name);
}
@Override
public void removeValue(String name) {
this .session.removeValue(name);
}
@Override
public void invalidate() {
this .session.invalidate();
}
@Override
public boolean isNew() {
return this .session.isNew();
}
}
|
以上代码就能把session保存到redis,当然这其中还有很多问题,比如sessionId的生成,session过去,对象序列化(测试为了方便统一用了string),等等很多问题。以后有时间再完善。
希望本文所述对大家java程序设计有所帮助。
原文链接:https://blog.csdn.net/ppt0501/article/details/46700221