HttpServletRequestWrapper模擬實現分散式Session
HttpSession的內容都放在一個單獨的Map中,模擬遠端分散式Session。
1.使用HttpServletRequestWrapper建立自定義Request
2.使用動態代理包裝自定義Request返回的HttpSession物件
3.建立過濾器,使用自定義Request替換原有的Request物件。
4.在Servlet中得到的HttpSession物件,寫入和讀取內容都假設透過遠端Session伺服器。
建立自定義的Request,返回動態代理的HttpSession
使用過濾器替換原有的Request
在Servlet中按照原有方式使用HttpSession。
結果可以看到,他已經模擬從遠端伺服器存取資料
[存入]key:name,value:Hello
[取出]key:name,value:Hello
[取出]key:other,value:null
1.使用HttpServletRequestWrapper建立自定義Request
2.使用動態代理包裝自定義Request返回的HttpSession物件
3.建立過濾器,使用自定義Request替換原有的Request物件。
4.在Servlet中得到的HttpSession物件,寫入和讀取內容都假設透過遠端Session伺服器。
建立自定義的Request,返回動態代理的HttpSession
-
import java.lang.reflect.InvocationHandler;
-
import java.lang.reflect.Method;
-
import java.lang.reflect.Proxy;
-
import java.util.HashMap;
-
import java.util.Map;
-
import java.util.concurrent.ConcurrentHashMap;
-
-
import javax.servlet.http.HttpServletRequest;
-
import javax.servlet.http.HttpServletRequestWrapper;
-
import javax.servlet.http.HttpServletResponse;
-
import javax.servlet.http.HttpServletResponseWrapper;
-
import javax.servlet.http.HttpSession;
-
-
public class RemoteSessionRequest extends HttpServletRequestWrapper {
-
-
public RemoteSessionRequest(HttpServletRequest request) {
-
super(request);
-
}
-
-
@Override
-
public HttpSession getSession() {
-
return RemoteSessionHandler.getInstance(super.getSession());
-
}
-
}
-
-
class RemoteSessionHandler implements InvocationHandler {
-
//模擬遠端Session伺服器,Key表示SessionId,Value表示該Session的內容
-
private static Map<String, Map<String, Object>> map = new ConcurrentHashMap<String, Map<String, Object>>();
-
-
private HttpSession session = null;
-
-
private RemoteSessionHandler(HttpSession httpSession) {
-
this.session = httpSession;
-
};
-
-
public static HttpSession getInstance(HttpSession httpSession) {
-
InvocationHandler handler = new RemoteSessionHandler(httpSession);
-
return (HttpSession) Proxy.newProxyInstance(httpSession.getClass().getClassLoader(), httpSession.getClass().getInterfaces(), handler);
-
}
-
-
@Override
-
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
-
if ("setAttribute".equals(method.getName())) {
-
String id = session.getId();
-
Map<String, Object> m = map.get(id);
-
if (m == null) {
-
m = new HashMap<String, Object>();
-
map.put(id, m);
-
}
-
m.put((String) args[0], args[1]);
-
System.out.println("[存入]key:" + args[0] + ",value:" + args[1]);
-
return null;
-
} else if ("getAttribute".equals(method.getName())) {
-
String id = session.getId();
-
Map<String, Object> m = map.get(id);
-
if (m == null) {
-
return null;
-
}
-
Object result = m.get(args[0]);
-
System.out.println("[取出]key:" + args[0] + ",value:" + result);
-
return result;
-
}
-
return method.invoke(session, args);
-
}
-
- }
-
import java.io.IOException;
-
import javax.servlet.Filter;
-
import javax.servlet.FilterChain;
-
import javax.servlet.FilterConfig;
-
import javax.servlet.ServletException;
-
import javax.servlet.ServletRequest;
-
import javax.servlet.ServletResponse;
-
import javax.servlet.annotation.WebFilter;
-
import javax.servlet.http.HttpServletRequest;
-
-
@WebFilter("/*")
-
public class SessionFilter implements Filter {
-
@Override
-
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
-
chain.doFilter(new RemoteSessionRequest((HttpServletRequest) request), response);
-
}
-
-
@Override
-
public void destroy() {
-
// TODO Auto-generated method stub
-
-
}
-
-
@Override
-
public void init(FilterConfig arg0) throws ServletException {
-
// TODO Auto-generated method stub
-
-
}
- }
在Servlet中按照原有方式使用HttpSession。
-
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-
HttpSession session = request.getSession();
-
session.setAttribute("name", "Hello");
-
session.getAttribute("name");
-
session.getAttribute("other");
- }
[存入]key:name,value:Hello
[取出]key:name,value:Hello
[取出]key:other,value:null
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1063018/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 分散式系統Session 實現方式分散式Session
- java web 中分散式 session 的實現JavaWeb分散式Session
- NodeJS+Redis實現分散式Session方案NodeJSRedis分散式Session
- 分散式中使用 Redis 實現 Session 共享(上)分散式RedisSession
- 分散式中使用 Redis 實現 Session 共享(中)分散式RedisSession
- 分散式中使用 Redis 實現 Session 共享(下)分散式RedisSession
- strlen函式的模擬實現函式
- 許可權處理 - 用redis實現分散式session~ (cookie && session )Redis分散式SessionCookie
- javascript模擬實現函式過載JavaScript函式
- Vue響應式原理與模擬實現Vue
- 模擬實現字串函式strlen , strcpy ,strcmp字串函式
- Session分散式共享 = Session + Redis + NginxSession分散式RedisNginx
- 如何通過J2Cache實現分散式session儲存分散式Session
- promise的模擬實現Promise
- javascript模擬實現replaceAll()JavaScript
- js模擬實現replaceAll()函式程式碼例項JS函式
- 通過session模擬登陸Session
- 等待模擬-read by other sessionSession
- SpringSession系列-分散式 session 實現方案及 SpringSession 功能分析SpringGseSession分散式
- 實現分散式鎖分散式
- 分散式鎖實現分散式
- springboot+redis分散式鎖-模擬搶單Spring BootRedis分散式
- 細節解析 JavaScript 中 bind 函式的模擬實現JavaScript函式
- javascript模擬new的實現JavaScript
- JavaScript 模擬new的實現JavaScript
- 【Java】——模擬登入實現Java
- JavaScript模擬實現replaceAll方法JavaScript
- 大規模非同步新聞爬蟲的分散式實現非同步爬蟲分散式
- read by other session等待事件模擬Session事件
- 分散式鎖----Redis實現分散式Redis
- Redis實現分散式鎖Redis分散式
- 分散式鎖及其實現分散式
- Redis分散式實現原理Redis分散式
- LightDB分散式實現分散式
- 分散式鎖的實現分散式
- memcached 分散式實現原理分散式
- 模擬實現apply/call/bindAPP
- bind,call,apply模擬實現APP