一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務(wù)器之家 - 編程語言 - Java教程 - Java簡單實現(xiàn)session保存到redis的方法示例

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

2021-04-28 11:44ppt0501 Java教程

這篇文章主要介紹了Java簡單實現(xiàn)session保存到redis的方法,結(jié)合實例形式分析了Java將session存入redis緩存服務(wù)器的相關(guān)設(shè)置、實現(xiàn)技巧與操作注意事項,需要的朋友可以參考下

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

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

一、配置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>

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

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

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

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

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

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

?
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過去,對象序列化(測試為了方便統(tǒng)一用了string),等等很多問題。以后有時間再完善。

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

原文鏈接:https://blog.csdn.net/ppt0501/article/details/46700221

延伸 · 閱讀

精彩推薦
  • Java教程淺析Java線程的中斷機制

    淺析Java線程的中斷機制

    本篇文章通過代碼實例給大家分享了學(xué)習Java線程的中斷機制的一些心得內(nèi)容,有興趣的朋友學(xué)習下吧。...

    傅易6562021-03-09
  • Java教程Jmeter分布式壓力測試實現(xiàn)過程詳解

    Jmeter分布式壓力測試實現(xiàn)過程詳解

    這篇文章主要介紹了Jmeter分布式壓力測試實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可...

    yaominghui1972020-09-08
  • Java教程詳解安裝Eclipse Maven插件的幾種方法

    詳解安裝Eclipse Maven插件的幾種方法

    本篇文章主要介紹了詳解安裝Eclipse Maven插件的幾種方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    紀爭光8032021-03-17
  • Java教程java8 forEach結(jié)合Lambda表達式遍歷 List操作

    java8 forEach結(jié)合Lambda表達式遍歷 List操作

    這篇文章主要介紹了java8 forEach結(jié)合Lambda表達式遍歷 List操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    91奔跑的蝸牛4712020-09-15
  • Java教程Spring Boot JPA如何把ORM統(tǒng)一起來

    Spring Boot JPA如何把ORM統(tǒng)一起來

    Spring Data JPA 是 Spring 基于 ORM 框架、JPA 規(guī)范的基礎(chǔ)上封裝的一套JPA應(yīng)用框架,可使開發(fā)者用極簡的代碼即可實現(xiàn)對數(shù)據(jù)的訪問和操作,本文給大家詳細介紹了...

    張占嶺7842021-04-22
  • Java教程Core Java 簡單談?wù)凥ashSet(推薦)

    Core Java 簡單談?wù)凥ashSet(推薦)

    下面小編就為大家?guī)硪黄狢ore Java 簡單談?wù)凥ashSet(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    huangqingshi11072021-01-04
  • Java教程java與php的區(qū)別淺析

    java與php的區(qū)別淺析

    在本篇文章里小編給大家整理了關(guān)于java與php的區(qū)別以及相關(guān)知識點,有興趣的朋友們學(xué)習下。...

    laozhang4942019-06-24
  • Java教程Java完美實現(xiàn)2048小游戲

    Java完美實現(xiàn)2048小游戲

    本文給大家分享的是一則根據(jù)網(wǎng)友的代碼改編的2048小游戲的源碼,個人認為已經(jīng)非常完美了,推薦給大家,有需要的小伙伴可以參考下。 ...

    hebedich4512019-12-14
主站蜘蛛池模板: 操儿媳小说 | 亚洲免费高清视频 | 日本免费观看的视频在线 | 天堂网www中文天堂在线 | 美女靠逼免费视频 | 日韩毛片免费在线观看 | 午夜AV国产欧美亚洲高清在线 | 天天综合天天影视色香欲俱全 | 国产99视频精品免费视频免里 | 亚洲精品第五页中文字幕 | 天堂网在线网站成人午夜网站 | 欧美成人免费观看国产 | 热久久最新地址 | 视频免费视频观看网站 | 青柠网在线观看视频 | 国内精品久久久久小说网 | 性满足久久久久久久久 | 国产图片综合区 | 日产精品一二三四区国产 | 97午夜视频 | 男同精品视频免费观看网站 | 亚洲精品www久久久久久久软件 | 亚洲福利视频在线观看 | 国产婷婷综合丁香亚洲欧洲 | 欧美日本道免费一区二区三区 | 超碰97 | 日韩一级片免费观看 | 国产福利在线观看第二区 | 国产aaa毛片 | 视频在线观看高清免费 | 欧美福利在线观看 | 国内老司机精品视频在线播出 | 亚洲大片在线观看 | 午夜伦伦电影理论片费看 | 亚洲AV久久久久久久无码 | 国产一区国产二区国产三区 | 久久爽狠狠添AV激情五月 | 大陆国产vs国产对白 | 荷兰精品女人性hd | 四虎影院免费在线播放 | jiizz亚洲护士厕所 |