HttpServletRequestWrapper模拟实现分布式Session
来源:互联网 发布:cn域名个人备案 编辑:程序博客网 时间:2024/05/29 14:43
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
0 0
- HttpServletRequestWrapper模拟实现分布式Session
- HttpServletRequestWrapper模拟实现分布式Session
- HttpServletRequestWrapper模拟实现分布式Session
- Memcached分布式缓存,模拟Session
- HttpServletRequestWrapper 实现xss注入
- 分布式session实现原理
- HttpServletRequestWrapper
- HttpServletRequestWrapper 实现xss注入(2)
- 分布式环境下用redis模拟session
- 分布式cookie-session的实现(spring-session)
- Spring Session + Redis实现分布式Session共享
- Spring Session + Redis实现分布式Session共享
- Spring Session + Redis实现分布式Session共享
- Spring Session + Redis实现分布式Session共享
- Spring Session + Redis实现分布式Session共享
- Spring Session + Redis实现分布式Session共享
- Spring Session + Redis实现分布式Session共享
- Spring Session + Redis实现分布式Session共享
- 光绘发明——LED视觉显示棒magicShifter3000,坚守15年的创造之旅!
- base64位字符 上传多张图片保存服务器端
- 互斥锁、条件变量、信号量
- Linux下多核、GPU编程
- Android酷炫实用的开源框架(UI框架)
- HttpServletRequestWrapper模拟实现分布式Session
- 微信蓝牙设备开发教程之获取蓝牙设备deviceid和设备二维码(2)
- Oracle查询语句(一)
- centos下排查vsftpd出现put零字节问题的记录
- 写给想做互联网产品经理的师弟师妹们一些话
- Android Studio 引入Library项目
- 进程与线程的区别
- block
- 新版MySql重置初始密码问题