日期:2014-05-17 浏览次数:20786 次
package test; import javax.servlet.ServletContext; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpSession; import org.apache.struts.action.ActionMapping; public class sessionCheck { private static sessionCheck sessioncheck; public sessionCheck(HttpServlet servlet) { } public static sessionCheck getInstance(HttpServlet servlet) { if (sessioncheck==null) { sessioncheck=new sessionCheck(servlet); } return sessioncheck; } public void setSession(String userName,HttpServlet servlet,HttpSession session,ActionMapping mapping) { final ServletContext sc = servlet.getServletContext();//取得容器,容器中根据用户唯一标识userID存放session System.out.println(sc); System.out.println(session); if (sc.getAttribute(userName) != null) { // 第二次登陆后第一次无效 ((HttpSession) sc.getAttribute(userName)).invalidate();// 清除第一次登陆的session System.out.println(session); } sc.setAttribute(userName, session);//放入当前最新session mapping.findForward("sessionDestroy") ; } }
------解决方案--------------------
上面各位的想法都有看,
1.cooKie有可能不开的
2.把session放ServletContext会不会导致内存泄露啊,这个待验证
3.客户端一定不能靠ajax搞大量并发服务器承受不了
4.靠javascript监控页面关闭事件是不可靠的,遨游下默认就不好使
同一账号可以登录两次的方案:
我没有这方面需求所以也不太了解常规是如果干的,但是有一点你要清楚,就是msn是c/s程序他的工作方式和http协议是不同的,http是无状态的,客户端必须主动请求服务器才行,也就是说如果B提掉A,系统要提示A的话需要靠异步job不断的请求服务器,这样压力太大了.
下面我想出一个比较可行的方案:
A先上线B后上线,这时系统不要提示A已经被提掉了,而是在A再次访问其他页面的时候(这时候是要走过滤器的),过滤器判断出A已经被T了,这时候在提示A,也就是说让A触发这个被T的消息.
如何知道A已经失效用4楼的方法就可以了.
同一账号不可以登录两次的方案:
老实说我觉得除非客户端ajax并发否则没有太精准的办法.