加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

简单的session共享的封装

发布时间:2020-12-14 06:21:19 所属栏目:Java 来源:网络整理
导读:目的 session存储在缓存服务器上(各种缓存服务器上均可,本文以memcached为例),但对开发者来说,他不用关注,只需要调用request.getSession()方法即可获取到session,然后对session的属性进行操作。 面临的问题 1. session获取,不是从application的服务器

目的

  session存储在缓存服务器上(各种缓存服务器上均可,本文以memcached为例),但对开发者来说,他不用关注,只需要调用request.getSession()方法即可获取到session,然后对session的属性进行操作。

面临的问题

  1. session获取,不是从application的服务器上获取,要从memcached上获取。

  2. session属性的获取及设置,不是设置到application服务器上,而是操作memcached获取或者设置。

解决问题的方法

  1. 使用一个HttpServletRequestWrapper的实现类,重写getSession()方法,然后使用filter,来过滤每个请求,使request变为requestWrapper。

  2. 使用一个HttpSessionAttributeListener的实现类,重写attributeAdded()、attributeRemoved()、attributeReplaced()方法,当属性发生改变时需要通知memcached中的session发生改变

另外:为解决各个异构系统因语言不通可能发生的兼容问题,session以json字符串存储。

具体代码如下:

wrapper类

<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.http.HttpServletRequest;
<span style="color: #0000ff;">import
<span style="color: #000000;"> javax.servlet.http.HttpServletRequestWrapper;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.http.HttpSession;

<span style="color: #0000ff;">import<span style="color: #000000;"> org.springframework.util.StringUtils;

<span style="color: #0000ff;">import<span style="color: #000000;"> com.fasterxml.jackson.core.JsonParseException;
<span style="color: #0000ff;">import<span style="color: #000000;"> com.fasterxml.jackson.databind.JsonMappingException;
<span style="color: #0000ff;">import<span style="color: #000000;"> com.javacodegeeks.util.JacksonMapUtil;
<span style="color: #0000ff;">import<span style="color: #000000;"> com.javacodegeeks.util.MemcachedUtil;

<span style="color: #0000ff;">public <span style="color: #0000ff;">class GetSessionWrapper <span style="color: #0000ff;">extends<span style="color: #000000;"> HttpServletRequestWrapper{
<span style="color: #0000ff;">private String sessionId=<span style="color: #0000ff;">null<span style="color: #000000;">;
<span style="color: #0000ff;">public<span style="color: #000000;"> GetSessionWrapper(HttpServletRequest request) {
<span style="color: #0000ff;">super<span style="color: #000000;">(request);
}
<span style="color: #0000ff;">public<span style="color: #000000;"> GetSessionWrapper(HttpServletRequest request,String sessionId) {
<span style="color: #0000ff;">super<span style="color: #000000;">(request);
<span style="color: #0000ff;">this<span style="color: #000000;">.setSessionId(sessionId);
}

@Override
</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; HttpSession getSession() {
    HttpSession httpSession</span>=<span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;.getSession();
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;id-->sessionId;</span>
    String id="davidwang456"<span style="color: #000000;"&gt;;
    String json</span>=<span style="color: #000000;"&gt;MemcachedUtil.getValue(id);
    </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt;(StringUtils.isEmpty(json)){
        </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; httpSession;
    }
    httpSession.setAttribute(</span>"JPHPSESSID"<span style="color: #000000;"&gt;,id);
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 读取JSON数据</span>
    Map<String,Object><span style="color: #000000;"&gt; userData;
    </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt; {
        userData </span>= JacksonMapUtil.getMapper().readValue(json,Map.<span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt;);
        </span><span style="color: #0000ff;"&gt;for</span>(Map.Entry<String,Object><span style="color: #000000;"&gt; entry:userData.entrySet()){ 
            httpSession.setAttribute(entry.getKey(),entry.getValue());    
       } 
    } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (JsonParseException e) {
        System.out.println(</span>"json字符串不能解析成功!"<span style="color: #000000;"&gt;);
    } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (JsonMappingException e) {
        System.out.println(</span>"json字符串不能映射到Map!"<span style="color: #000000;"&gt;);
    } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (IOException e) {
        System.out.println(</span>"io异常!"<span style="color: #000000;"&gt;);
    }
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; httpSession;
}

@Override
</span><span style="color: #0000ff;"&gt;public</span> HttpSession getSession(<span style="color: #0000ff;"&gt;boolean</span><span style="color: #000000;"&gt; create) {
    HttpSession httpSession</span>=<span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;.getSession(create);
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; httpSession;        
}
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; main(String[] args) {
    String sessionId</span>="davidwang456"<span style="color: #000000;"&gt;;
    String json</span>=<span style="color: #000000;"&gt;MemcachedUtil.getValue(sessionId);
    System.out.println(json);
}
</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; String getSessionId() {
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; sessionId;
}
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; setSessionId(String sessionId) {
    </span><span style="color: #0000ff;"&gt;this</span>.sessionId =<span style="color: #000000;"&gt; sessionId;
}

}

<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.FilterChain;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.FilterConfig;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.ServletException;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.ServletRequest;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.ServletResponse;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.http.Cookie;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.http.HttpServletRequest;

<span style="color: #0000ff;">import<span style="color: #000000;"> org.springframework.web.util.WebUtils;

<span style="color: #0000ff;">public <span style="color: #0000ff;">class FetchSession <span style="color: #0000ff;">implements<span style="color: #000000;"> javax.servlet.Filter{
<span style="color: #0000ff;">private <span style="color: #0000ff;">static <span style="color: #0000ff;">final String regex=".*(css|html|ico|html|jpg|jpeg|png|gif|js)"<span style="color: #000000;">;
@Override
<span style="color: #0000ff;">public <span style="color: #0000ff;">void init(FilterConfig filterConfig) <span style="color: #0000ff;">throws<span style="color: #000000;"> ServletException {

}

</span><span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;static</span><span style="color: #000000;"&gt; String getSessionId(ServletRequest request){
    HttpServletRequest httpRequest</span>=<span style="color: #000000;"&gt;(HttpServletRequest)request;
    String sessionId</span>=""<span style="color: #000000;"&gt;;
    Cookie cookie </span>=WebUtils.getCookie(httpRequest,"PHPSESSID"<span style="color: #000000;"&gt;);
    </span><span style="color: #0000ff;"&gt;if</span>(cookie!=<span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;){
        </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; cookie.getValue();
    }
    cookie </span>=WebUtils.getCookie(httpRequest,"JSESSIONID"<span style="color: #000000;"&gt;);
    </span><span style="color: #0000ff;"&gt;if</span>(cookie!=<span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;){
        sessionId</span>=<span style="color: #000000;"&gt; cookie.getValue();
    }
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; sessionId;
}

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; doFilter(ServletRequest request,ServletResponse response,FilterChain chain) </span><span style="color: #0000ff;"&gt;throws</span><span style="color: #000000;"&gt; IOException,ServletException {
        String sessionId</span>=<span style="color: #000000;"&gt;getSessionId(request);
        HttpServletRequest httpRequest</span>=<span style="color: #000000;"&gt;(HttpServletRequest)request;    
        String requestedUri</span>=<span style="color: #000000;"&gt;httpRequest.getRequestURL().toString();
        System.out.println(requestedUri);
        </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt;(requestedUri.matches(regex)){
            chain.doFilter(request,response);
            </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt;;
        }
        GetSessionWrapper wrapperRequest</span>=<span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; GetSessionWrapper(httpRequest,sessionId);
        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;HttpSession httpSession=wrapperRequest.getSession();</span>

<span style="color: #000000;"> chain.doFilter(wrapperRequest,response);
}

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; destroy() {
}

}

<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.http.HttpSession;
<span style="color: #0000ff;">import
<span style="color: #000000;"> javax.servlet.http.HttpSessionAttributeListener;
<span style="color: #0000ff;">import
<span style="color: #000000;"> javax.servlet.http.HttpSessionBindingEvent;

<span style="color: #0000ff;">import<span style="color: #000000;"> org.springframework.util.StringUtils;

<span style="color: #0000ff;">import<span style="color: #000000;"> com.fasterxml.jackson.core.JsonParseException;
<span style="color: #0000ff;">import<span style="color: #000000;"> com.fasterxml.jackson.core.JsonProcessingException;
<span style="color: #0000ff;">import<span style="color: #000000;"> com.fasterxml.jackson.databind.JsonMappingException;
<span style="color: #0000ff;">import<span style="color: #000000;"> com.fasterxml.jackson.databind.ObjectMapper;
<span style="color: #0000ff;">import<span style="color: #000000;"> com.javacodegeeks.util.JacksonMapUtil;
<span style="color: #0000ff;">import<span style="color: #000000;"> com.javacodegeeks.util.MemcachedUtil;

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> MySessionAttributeListener
<span style="color: #0000ff;">implements<span style="color: #000000;"> HttpSessionAttributeListener {
<span style="color: #0000ff;">private <span style="color: #0000ff;">static AtomicInteger count=<span style="color: #0000ff;">new AtomicInteger(0<span style="color: #000000;">);
<span style="color: #0000ff;">private <span style="color: #0000ff;">static AtomicInteger countU=<span style="color: #0000ff;">new AtomicInteger(0<span style="color: #000000;">);

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; attributeAdded(HttpSessionBindingEvent event) {
    </span><span style="color: #0000ff;"&gt;int</span> ss=<span style="color: #000000;"&gt;count.incrementAndGet();
    HttpSession session</span>=<span style="color: #000000;"&gt;event.getSession();
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;String sessionId=(String) session.getAttribute("JPHPSESSID");</span>
    String sessionId="davidwang456"<span style="color: #000000;"&gt;;
    String attributeName </span>=<span style="color: #000000;"&gt; event.getName();
    Object attributeValue </span>=<span style="color: #000000;"&gt; event.getValue();
    System.out.println(</span>"Attribute add " + attributeName + " : " + attributeValue+",ss="+<span style="color: #000000;"&gt;ss);
    String json</span>=<span style="color: #000000;"&gt;MemcachedUtil.getValue(sessionId);
    </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt;(StringUtils.isEmpty(json)){
        </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; ;
    }
    String json_new;
    </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt; {
        json_new </span>=<span style="color: #000000;"&gt; attributeAddOrUpdate(json,attributeName,attributeValue);
        MemcachedUtil.setValue(sessionId,json_new);
    } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (Exception e) {
        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated catch block</span>

<span style="color: #000000;"> e.printStackTrace();
}
}

</span><span style="color: #0000ff;"&gt;private</span><span style="color: #000000;"&gt; String attributeAddOrUpdate(String json,String key,Object value) 
                        </span><span style="color: #0000ff;"&gt;throws</span><span style="color: #000000;"&gt; JsonParseException,JsonMappingException,IOException{
    ObjectMapper mapper</span>=<span style="color: #000000;"&gt;JacksonMapUtil.getMapper();
    @SuppressWarnings(</span>"unchecked"<span style="color: #000000;"&gt;)
    Map</span><String,Object> userData = mapper.readValue(json,Map.<span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt;);
    Boolean flag</span>=String.<span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt;.isAssignableFrom(value.getClass());
    </span><span style="color: #0000ff;"&gt;if</span>(!<span style="color: #000000;"&gt;flag){
        Map</span><String,Object> map = mapper.convertValue(value,Map.<span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt;);
        userData.putAll(map);
    }</span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;{
        userData.put(key,value);
    }      
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; mapper.writeValueAsString(userData); 
}

</span><span style="color: #0000ff;"&gt;private</span><span style="color: #000000;"&gt; String attributeDel(String json,String key)
        </span><span style="color: #0000ff;"&gt;throws</span><span style="color: #000000;"&gt; JsonParseException,IOException {
    ObjectMapper mapper </span>=<span style="color: #000000;"&gt; JacksonMapUtil.getMapper();
    @SuppressWarnings(</span>"unchecked"<span style="color: #000000;"&gt;)
    Map</span><String,Map.<span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt;);
    userData.remove(key);
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; mapper.writeValueAsString(userData);
}

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; attributeRemoved(HttpSessionBindingEvent event) {
    HttpSession session</span>=<span style="color: #000000;"&gt;event.getSession();
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;String sessionId=(String) session.getAttribute("JPHPSESSID");</span>
    String sessionId="davidwang456"<span style="color: #000000;"&gt;;
    String attributeName </span>=<span style="color: #000000;"&gt; event.getName();
    System.out.println(</span>"Attribute del : " +<span style="color: #000000;"&gt; attributeName);
    String json</span>=<span style="color: #000000;"&gt;MemcachedUtil.getValue(sessionId);
    </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt;(StringUtils.isEmpty(json)){
        </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; ;
    }
    String json_new;
    </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt; {
        json_new </span>=<span style="color: #000000;"&gt; attributeDel(json,attributeName);
        MemcachedUtil.setValue(sessionId,json_new);
    } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (Exception e) {
        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated catch block</span>

<span style="color: #000000;"> e.printStackTrace();
}
}

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; attributeReplaced(HttpSessionBindingEvent event) {

    </span><span style="color: #0000ff;"&gt;int</span> ssu=<span style="color: #000000;"&gt;countU.incrementAndGet();
    HttpSession session</span>=<span style="color: #000000;"&gt;event.getSession();
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;String sessionId=(String) session.getAttribute("JPHPSESSID");</span>
    String sessionId="davidwang456"<span style="color: #000000;"&gt;;
    String attributeName </span>=<span style="color: #000000;"&gt; event.getName();
    Object attributeValue </span>=<span style="color: #000000;"&gt; event.getValue();
    System.out.println(</span>"Attribute update " + attributeName + " : " + attributeValue+",ss="+<span style="color: #000000;"&gt;ssu);
    String json</span>=<span style="color: #000000;"&gt;MemcachedUtil.getValue(sessionId);
    </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt;(StringUtils.isEmpty(json)){
        </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; ;
    }
    String json_new;
    </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt; {
        json_new </span>=<span style="color: #000000;"&gt; attributeAddOrUpdate(json,json_new);
    } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (Exception e) {
        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated catch block</span>

<span style="color: #000000;"> e.printStackTrace();
}

}

}

com.fasterxml.jackson.core jackson-databind 2.4.3 com.fasterxml.jackson.core jackson-annotations 2.4.3 com.fasterxml.jackson.datatype jackson-datatype-guava 2.4.3 com.fasterxml.jackson.datatype jackson-datatype-joda 2.4.3 com.fasterxml.jackson.datatype jackson-datatype-jsr310 2.4.3 net.spy spymemcached 2.12.0

注意:上面代码仅为demo代码,实际应用需重构代码。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读