博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何通过session控制单点登录
阅读量:4309 次
发布时间:2019-06-06

本文共 2663 字,大约阅读时间需要 8 分钟。

 web服务器为每一个浏览器实例对应一个session。这个session有自己的一个独立id,这个id保存在浏览器的cookie中(这个cookie貌似随着这个浏览器实例的关闭而清除),访问web服务器的时候,web服务会根据你cookie中的sessionId来决定重新创建一个session还是使用已经存在的session。

如果使用桌面的ie图标打开一个IE窗口,这个窗口属于一个新的浏览器实例(其中不包含sessionid信息),这时候用这个IE访问web服务器的时候web服务器会为这个浏览器实例新创建一个httpsession,sessionId也是新的(sessionId保存到本地的cookie中),不会对你以前打开的窗口中的session产生覆盖,关闭ie窗口的时候cookie中的信息也就清除掉了。 
如果是在打开的ie窗口中按“ctrl+n”打开一个ie窗口,这个窗口于刚才的窗口是同一个实例,与刚才的窗口共用session,所有的同一个ie实例的窗口都关掉后,会清除掉sessionId。

补充一点,可以通过人为的输入参数sessionId通知web服务器你使用的是哪个session(如果服务器存在这个session的话)。

*****************************************************************************************************************************************

         单点登录(有别于SSO:Single Sign On),首先解释一下对项目需求中的单点登录的理解:一个用户帐号成功登录后,在该次session还未失效之前,不能在其他机器上登录同一个帐号,这有点类似与QQ只能在同一台计算机上登录。好了,如何实现呢?现在分析一下:一次登录也就是一次会话(Session),那么我们可以很容易联想到通过控制session来实现单点登录,我的设想是这样的,登录后将用户信息保存到session中,如果此时在另外一台机器上一个相同的帐号请求登录,通过遍历Web服务中所有session并判断其中是否包含同样的用户信息,通过这样的判断,在另一台机器上登录该帐号是不成功的。
上面已经提到了,需要通过控制session,对web服务中所有session进行遍历操作,那么你肯定会想到application这个大对象了(当然你也可以采用缓存或者数据库),具体实现方法是这样的,首先在application中创建一个List<HttpSession>,用来保存每一次会话(session)对象,系统在验证用户登录请求时,通过遍历该list并加以判断,最后决定是否让该用户成功登录。OK,需求和设计都在上面了,接下来就是编码工作了哈。不过在这里还需要考虑几个问题:
1、如果登录后关闭了浏览器,想立即打开一个新的浏览器并登录将会失败,因为前一次登录后的session还没销毁,你需要等其销毁后方可再次登录成功,这种问题如何解决???哈哈,你是不是已经想到要用javascript处理一下下,即在关闭浏览器的时候触发一个事件,该事件就是通知来销毁当前session的。
2、第二个问题其实是接上一个问题而讨论的,用javascript触发浏览器关闭事件并不是一个好办法,因为有很多因素可能导致这个事件触发不成功,还有Firefox和IE这两个东东意见有时候并不统一,最后有一个比较可恶的问题就是,我在同一台机器上不能打开两个浏览器窗口去登录相同的帐号,因为一个浏览器对应一个session啊!这就是为什么我在文章一开始要引用一些基本知识。
既然问题很严重,那就动脑壳去想办法啊!我在这里自言自语了半天,我不打算用中文继续讲下去了,直接code上场吧:
 
login.jsp
Html代码
请输入帐号和密码:
用户名: 密  码: <%-- --%>
    
VerifyLogin类处理请求:
Java代码
String name=request.getParameter("name");    String pwd=request.getParameter("pwd");    String ip = request.getRemoteHost();    //String Ip=request.getRemoteAddr();      User user=UserHelp.getUserByName(name);    String err="";    if(user!=null){        if (user.getPwd().equals(pwd)){             //out.println("验证成功!");             boolean flag = true;             List
sessions = (List
)application.getAttribute("sessionlist"); for(int i = 0;i

 

转载于:https://www.cnblogs.com/lr393993507/p/5231395.html

你可能感兴趣的文章
不吹不黑 | 聊聊为什么要用99%精度的数据回测
查看>>
高频交易的几种策略
查看>>
量化策略回测TRIXKDJ
查看>>
量化策略回测唐安奇通道
查看>>
CTA策略如何过滤部分震荡行情?
查看>>
量化策略回测DualThrust
查看>>
量化策略回测BoolC
查看>>
量化策略回测DCCV2
查看>>
mongodb查询优化
查看>>
五步git操作搞定Github中fork的项目与原作者同步
查看>>
git 删除远程分支
查看>>
删远端分支报错remote refs do not exist或git: refusing to delete the current branch解决方法
查看>>
python multiprocessing遇到Can’t pickle instancemethod问题
查看>>
APP真机测试及发布
查看>>
通知机制 (Notifications)
查看>>
10 Things You Need To Know About Cocoa Auto Layout
查看>>
一个异步网络请求的坑:关于NSURLConnection和NSRunLoopCommonModes
查看>>
iOS 如何放大按钮点击热区
查看>>
ios设备唯一标识获取策略
查看>>
获取推送通知的DeviceToken
查看>>