您的位置:首页 > 其它

一个浏览器使用多个Session

2016-02-24 17:25 148 查看
网上资料:

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放使用缓存服务器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: