第 12 章 管理会话

转载:http://www.mossle.com/docs/auth/html/ch102-concurrent-session.html

第 12 章 管理会话

多个用户不能使用同一个账号同时登陆系统。

12.1. 添加监听器

在web.xml中添加一个监听器,这个监听器会在session创建和销毁的时候通知Spring Security。

<listener>
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>
        

这种监听session生命周期的监听器主要用来收集在线用户的信息,比如统计在线用户数之类的事。有关如何自己编写listener统计在线用户数,可以参考:http://www.mossle.com/docs/jsp/html/jsp-ch-08.html

12.2. 添加过滤器

在xml中添加控制同步session的过滤器。

<http auto-config=‘true‘>
    <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
    <intercept-url pattern="/**" access="ROLE_USER" />
    <session-management>
        <concurrency-control />
    </session-management>
</http>
        

12.3. 控制策略

12.3.1. 后面的用户禁止登陆

默认情况下,如果有一个人使用了一个账号登录了系统,其他人就不能再用这个账号登录了。

这个参数用来控制是否在会话数目超过最大限制时抛出异常,默认值是false,也就是不抛出异常,而是把之前的session都销毁掉,所以之前登陆的用户就会被踢出系统了。

现在我们把这个参数改为true,再使用同一个账号同时登陆一下系统,看看会发生什么现象。

图 12.1. 禁止同一账号多次登录

很好,现在只要有一个人使用user/user登陆过系统,其他人就不能再次登录了。这样可能出现一个问题,如果有人登陆的时候因为某些问题没有进行logout就退出了系统,那么他只能等到session过期自动销毁之后,才能再次登录系统。

12.3.2. 后登陆的将先登录的踢出系统

如果希望后登陆的用户会把先登录的用户踢出系统,需要为concurrent-session-control设置一个参数。

<http auto-config=‘true‘>
    <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
    <intercept-url pattern="/**" access="ROLE_USER" />
    <concurrent-session-control exception-if-maximum-exceeded="false"/>
</http>
            

想测试一下的话,先打开firefox使用user/user登陆系统,然后再打开ie使用user/user登陆系统。这时ie下的user用户会登陆成功,进入登陆成功页面。而firefox下的用户如何刷新页面,就会显示如下信息:

This session has been expired (possibly due to multiple concurrent logins being attempted as the same user).
            

这是因为先登录的用户已经被强行踢出了系统,如果他再次使用user/user登陆,ie下的用户也会被踢出系统了。

时间: 2024-08-30 05:16:30

第 12 章 管理会话的相关文章

CPrimer Plus第12章 存储类、链接和内存管理随笔

被static修饰的属于内部链接,不可被外部程序文件所使用一般而言,全局变量(文件作用域变量)具有静态存储期,局部变量(代码块作用域变量)具有自动存储期寄存器变量不能使用地址运算符因为被static修饰的变量不会中途被释放,所以不能用static修饰函数的形参变量的定义放在所有函数定义的外部即创建了一个外部变量,若外部变量在其他文件中定义,则需见extern修饰全局变量只能用常量表达式来赋值:int i;    int j = 2*i;不被允许 ptd = (double *)malloc(n

3.28日第七次作业12章沟通管理13章合同管理

3.28日第七次作业12章沟通管理13章合同管理   第12章.项目沟通管理   1.项目沟通管理包括哪些过程?(记)P349 答:1).沟通计划编制 2).信息分发 3).绩效报告 4).项目干系人管理 2.阻碍有效沟通的因素有哪些?P351-352 答:1).沟通双方的物理距离 2).沟通的环境因素 3).缺乏清晰的沟通渠道 4).复杂的组织结构 5).复杂的技术术语 6).有害的态度 3.沟通计划编制的第一步是什么?目的是什么?P353 答:沟通计划编制的第一步是干系人分析.其目的是得出项

第 12 章 命令模式【Command Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> 今天讲命令模式,这个模式从名字上看就很简单,命令嘛,老大发命令,小兵执行就是了,确实是这个意思,但是更深化了,用模式来描述真是是世界的命令情况.正在看这本书的你,我猜测分为两类:已经工作的和没有工作的,先说没有工作的,那你为啥要看这本书,为了以后工作呗,只要你参见工作,你肯定会待在项目组,那今天我们就以项目组为例子来讲述命令模式. 我是我们部门的项目经理,就是一个项目的头,在中国做项目,项目经理就是什么都要懂,什么都要管,做好

《构建之法》第10、11、12章

第10章问题:书上说一些好的功能还会有副作用,这里所说的副作用是指什么?是指功能没完善还是?(第十章10.2.1  P196第五) 第11章问题:开发阶段还有日常管理,这样不会浪费团队做项目的时间,做一个项目既要做Sprint计划,又要每日例会,还要规格说明书.功能说明书.列典型用户与典型场景                   描述等等,当这些完成后,确定还有时间弄项目吗?(第十一章11.2节) 第12章问题:用户体验和质量,有时候并不能同时做到很好,那么这两个当中那个要重要一点?要牺牲哪个取

《白帽子讲WEB安全》学习笔记之第12章 WEB框架安全

第12章 WEB框架安全 12.1 MVC框架安全 在Spring框架中可以使用spring security来增加系统的安全性. 12.2 模板引擎与XSS防御 12.3 WEB框架与CSRF防御 在MVC中防御CSRF: q  在Session中绑定token.如果不能保存到数据库中的Session,则使用Cookie. q  在form表单中自动填写token字段 q  在Ajax请求中封装token. q  在服务器端对比POST提交的token与Session绑定的Tiken是否一致.

阅读《构建之法》第10、11、12章

第10章 如果典型用户吴小石头的需求和问题太过麻烦或者复杂,我们是应该想办法解决还是换一个典型用户? 第11章软件设计与实现 软件设计过程中,如何管理设计变更呢? 第12章 用户体验 文中说道“用户体验设计的一个重要目的就是要降低用户的认知阻力!” 提出问题:不同用户的认知都有所不同,如何熟练地掌握认知用户的阻力大小呢?

读《构建之法》第11,12章有感

今天我读了<构建之法>的11,12章,其中第11章主要讲了软件的设计与实现的一些知识,告诉我们具体如何去开发一个软件.而第12章则为我们介绍了用户体验的相关知识,有些人认为用户界面的工作就是做一些优化,让界面更好看,而事实并不是这样,这一章就为我们做了详细的讲解. 我们写软件呢就是为了要解决用户的需求,而要解决用户的需求,就需要合适的方法:1.我们需要理解和抽象问题,将问题简化2.找到合适的模型3.最后按模型解决问题.而这其中分析和设计有许多方法:以文字为主的文档,如Word.PowerPoi

阅读10,11,12章

第10章 本章主要讲的是典型用户与场景,那么怎样定义典型用户? 答:(1)名字(越自然越好). (2)年龄(不同年龄和收入的用户有不同的需求). (3)收入. (4)代表的用户在市场上的比例和重要性(比例大不等同于重要性高,如付费的用户比例较少,但是影响大,所以更重要). (5)使用这个软件的典型场景. (6)使用本软件/服务的环境 (在办公室/家里/沙发/床上/公共汽车/地铁…). (7)生活/工作情况. (8)知识层次和能力(教育程度,对电脑.万维网的熟悉程度). (9)用户的动机.目的和困

C++ Primer学习总结 第12章 动态内存

第12章 动态内存 1.    申请并使用shared_ptr.  P400 2.    shared_ptr计数. P402 赋值, 拷贝, 向函数传递一个智能指针, 或函数返回一个智能指针都会增加当前智能指针的计数. 3.    不同对象间利用智能指针共享数据的例子. 4.    使用new来动态申请内存. P407 默认情况下,new申请的内存对象都是默认初始化的. 5.    new申请的const对象必须初始化. P408 如果申请内置类型, 那么必须用括号()初始化. 如果申请类类型