国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > Java > 正文

Java簡(jiǎn)單實(shí)現(xiàn)session保存到redis的方法示例

2024-07-14 08:40:47
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(shí)例講述了Java簡(jiǎn)單實(shí)現(xiàn)session保存到redis的方法。分享給大家供大家參考,具體如下:

在負(fù)載均衡情況下,如果用戶(hù)訪(fǎng)問(wèn)不同的機(jī)器,如果沒(méi)有做session同步,用戶(hù)就會(huì)被提出,這樣用戶(hù)體驗(yàn)非常不好,所以我們很有必要做session同步,把session放到reids緩存服務(wù)器就能很好的解決問(wèn)題。下面是代碼簡(jiǎn)單的實(shí)現(xiàn)。

一、配置web.xml過(guò)濾器:

<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>

二、配置對(duì)應(yīng)的過(guò)濾器名字:

<bean id="sessionFilter" class="com.plateno.interceptor.SessionFilter">    <property name="redisTemplate" ref="redisTemplate"/></bean>

三、SessionFilter的實(shí)現(xiàn):

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的實(shí)現(xiàn):

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的實(shí)現(xiàn):

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的實(shí)現(xiàn):

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,當(dāng)然這其中還有很多問(wèn)題,比如sessionId的生成,session過(guò)去,對(duì)象序列化(測(cè)試為了方便統(tǒng)一用了string),等等很多問(wèn)題。以后有時(shí)間再完善。

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JAVA教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 海城市| 望城县| 扶沟县| 开江县| 青海省| 盈江县| 蓬安县| 大田县| 通州市| 运城市| 洪雅县| 中阳县| 于都县| 买车| 巫溪县| 左云县| 和田市| 仙居县| 常宁市| 宁南县| 玉龙| 平山县| 肥乡县| 苍南县| 肇东市| 寿阳县| 体育| 合水县| 乌什县| 正阳县| 克什克腾旗| 抚州市| 武功县| 天祝| 大竹县| 石阡县| 冕宁县| 太康县| 金堂县| 平和县| 舒兰市|