一个浏览器使用多个Session
2016-02-24 17:25
148 查看
网上资料:
Spring Session认为第一个问题,也就是在高可用可扩展的集群中存储数据已经通过各种数据存储方案得到了解决,如Redis、GemFire以及Apache Geode等。
自己解决办法:
SessionManager.java
SmcsSession.java
SessionManager.java配置为过滤器,当出现登陆index.html页面时,请求验证码时,进入过滤器方法
效果:
也可以把Session放使用缓存服务器。
Spring Session认为第一个问题,也就是在高可用可扩展的集群中存储数据已经通过各种数据存储方案得到了解决,如Redis、GemFire以及Apache Geode等。
自己解决办法:
SessionManager.java
import java.io.IOException; import org.apache.log4j.Logger; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SessionManager implements Filter{ private static final Logger log=Logger.getLogger(SessionManager.class); private static final String SMCS_LOG="SUIHUASMCSLOG"; @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; //cookies Cookie[] cookies = request.getCookies(); Cookie ACookie = null; boolean HaveSmcsSession=false;//不包含 String uuid=java.util.UUID.randomUUID().toString(); String sessionID=uuid.replaceAll("-", ""); System.err.println("添加smcs_sessionID==="+sessionID); if (cookies != null) { for (int i = 0; i < cookies.length; i++) { ACookie = cookies[i]; String cookiename = ACookie.getName(); String cookiealue = ACookie.getValue(); if(cookiename.equals(SessionManager.SMCS_LOG)){ sessionID=cookiealue; HaveSmcsSession=true; break; } } //不包含 if(!HaveSmcsSession){ Cookie cookie_smcs = new Cookie(SessionManager.SMCS_LOG,sessionID); cookie_smcs.setPath("/");// 这个要设置 //cookie_smcs.setDomain(".aotori.com"); //cookie_smcs.setMaxAge(365 * 24 * 60 * 60); // 不设置的话,则cookies不写入硬盘,而是写在内存,只在当前页面有用,以秒为单位 response.addCookie(cookie_smcs); } }else if(cookies==null){ Cookie cookie_smcs = new Cookie(SessionManager.SMCS_LOG,sessionID); cookie_smcs.setPath("/");// 这个要设置 //cookie_smcs.setDomain(".aotori.com"); //cookie_smcs.setMaxAge(365 * 24 * 60 * 60); // 不设置的话,则cookies不写入硬盘,而是写在内存,只在当前页面有用,以秒为单位 response.addCookie(cookie_smcs); } ServletContext ctx = request.getSession().getServletContext(); SmcsSession session = new SmcsSession(); if(ctx.getAttribute(sessionID)==null){ ctx.setAttribute(sessionID, session); } log.info("my session manager...."); filterChain.doFilter(request, response); } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } public static SmcsSession getSession(HttpServletRequest request){ ServletContext ctx = request.getSession().getServletContext(); Cookie[] cookies = request.getCookies(); SmcsSession session = new SmcsSession(); String sessionID = null; if(cookies!=null){ for (int i = 0; i < cookies.length; i++) { Cookie ACookie = cookies[i]; String cookiename = ACookie.getName(); String cookiealue = ACookie.getValue(); if(cookiename.equals(SessionManager.SMCS_LOG)){ sessionID = cookiealue; break; } } } if(sessionID==null) return session; return (SmcsSession)ctx.getAttribute(sessionID); } }
SmcsSession.java
import java.util.Enumeration; import java.util.HashMap; import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionContext; public class SmcsSession implements HttpSession { private HashMap<String,Object> map=new HashMap<String,Object>(); @Override public Object getAttribute(String keyname) { if(map!=null){ return map.get(keyname); } return null; } @Override public void setAttribute(String keyname, Object obj) { map.put(keyname, obj); } @Override public Enumeration<String> getAttributeNames() { // TODO Auto-generated method stub return null; } @Override public long getCreationTime() { // TODO Auto-generated method stub return 0; } @Override public String getId() { // TODO Auto-generated method stub return null; } @Override public long getLastAccessedTime() { // TODO Auto-generated method stub return 0; } @Override public int getMaxInactiveInterval() { // TODO Auto-generated method stub return 0; } @Override public ServletContext getServletContext() { return null; } @Override public HttpSessionContext getSessionContext() { // TODO Auto-generated method stub return null; } @Override public Object getValue(String arg0) { // TODO Auto-generated method stub return null; } @Override public String[] getValueNames() { // TODO Auto-generated method stub return null; } @Override public void invalidate() { // TODO Auto-generated method stub } @Override public boolean isNew() { // TODO Auto-generated method stub return false; } @Override public void putValue(String arg0, Object arg1) { // TODO Auto-generated method stub } @Override public void removeAttribute(String arg0) { // TODO Auto-generated method stub } @Override public void removeValue(String arg0) { // TODO Auto-generated method stub } @Override public void setMaxInactiveInterval(int arg0) { // TODO Auto-generated method stub } }
SessionManager.java配置为过滤器,当出现登陆index.html页面时,请求验证码时,进入过滤器方法
<filter> <filter-name>sessionManager</filter-name> <filter-class>com.common.web.controller.SessionManager</filter-class> </filter> <filter-mapping> <filter-name>sessionManager</filter-name> <url-pattern>/login/code.html</url-pattern> </filter-mapping>
效果:
也可以把Session放使用缓存服务器。
相关文章推荐
- ubuntu 网址
- 自定义Dialog含有Editte自动弹出软键盘
- js计数器方法:setInterval()和clearInterval();setTimeout()和clearTimeout()
- leetcode 171. Excel Sheet Column Number
- seajs的使用--主要了解模块化
- 遥感影像分类(监督分类,最小距离法)
- js正则表达式语法
- 企业处理事件风暴的 2 种最佳管理方法
- Oracle查询出最最近一次的一条记录
- Android 知识点
- 又见 sizeof
- 122. Best Time to Buy and Sell Stock II
- JAVA学习【6】JAVA中i++与++i的不同
- 排序算法总结
- iOS三种拨打电话的方法
- js里json中的时间日期获取方法
- 轻松理解javascript中的闭包(Understand JavaScript Closures With Ease)
- 使用java连接AD域,验证账号密码是否正确
- LeetCode 222. Count Complete Tree Nodes
- idea快捷键总结