セッションをredisに保存する簡単な実装
負荷等化の場合,ユーザが異なる機器にアクセスし,セッション同期を行わなければユーザが提案されるため,ユーザ体験が非常に悪いため,セッション同期を行う必要が遠く,セッションをreidsキャッシュサーバに置くことで問題をうまく解決できる.次はコードの簡単な実装です.
一、webを配置する.xmlフィルタ:
二、対応するフィルタ名を配置する:
三、
SessionFilterの実装:
四、
TerryHttpServiceRequestWrapperの実装:
六、HttpSessionWrapperの実現:
以上のコードでセッションをredisに保存できますが、セッションIdの生成、セッション過去、オブジェクトシーケンス化(テストはstringを便利に統一するために使用されています)など、多くの問題があります.後で改善する時間がある.
一、webを配置する.xmlフィルタ:
sessionFilter
org.springframework.web.filter.DelegatingFilterProxy
sessionFilter
/*
二、対応するフィルタ名を配置する:
三、
SessionFilterの実装:
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;
}
}
四、
TerryHttpServiceRequestWrapperの実装:
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の実現: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 getAttributeNames() {
final byte[] key = stringSerializer.serialize(sid);
Object result = redisTemplate.execute(new RedisCallback
六、HttpSessionWrapperの実現:
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 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();
}
}
以上のコードでセッションをredisに保存できますが、セッションIdの生成、セッション過去、オブジェクトシーケンス化(テストはstringを便利に統一するために使用されています)など、多くの問題があります.後で改善する時間がある.