Token+Session实现不同后台系统单点登录

1.需求描述

有两个后台系统A、B。现在需要A系统的后台用户,登录A系统之后,能够访问B系统的公告功能。针对这个需求有两种解决方案:
1>将A系统的所有用户接入B系统中;(开发工作量大,业务逻辑复杂);
2>采用Token+Session方式,实现A系统的后台用户单点登录(开发工作量小,业务逻辑简单)。

2.具体实现

A系统后台用户访问,B系统的公告可分为以下步骤:

首先设计表ACCESS_TOKEN_SESSION,核心表字段:token、sessonId。
Step1: 获取token
A系统访问时,B系统会在在ACCESS_TOKEN_SESSION表插入一条访问记录。
eg:访问链接 http://localhost:8080/Jaden/hz15/getToken
同时B系统开发IpWhiteListFilter过滤器,只有指定请求IP才能获取到B系统的访问token

Step2: 携带token访问公告功能页面
eg:http://localhost:8080/cams/html/notice.html?token=XXX
B系统开发TokenVefityFilter过滤器,判断token是否非空、是否在数据库已有。如果token有效,获取当前请求的sessionId,更新到ACCESS_TOKEN_SESSION表的对应记录中;否则跳转到访问拒绝页面。

Step3:访问公告功能
B系统开发AppNoticeReqInterceptor拦截器,判断URL符合/appNotice/**请求,对应的sessionId是否有效。(即在ACCESS_TOKEN_SESSION表根据当前sessionId可以查询到一条记录)
只有sessionId有效,才能继续访问公告功能:列表展示、新增公告等;否则跳转到访问拒绝页面。

Step4: Session超时处理
B系统自定义ASessionTimeoutListener监听器:当A系统生成的Session失效后,根据sessionId将ACCESS_TOKEN_SESSION表对应记录物理删除

3.开发过程,关联基础知识深入

1.Ajax重定向
默认ajax是不支持重定向的,因为ajax本身就是局部刷新,不重新加载页面的。可以通过前后端共同更改实现。
2.Session监听器注入Spring Bean
1>因为监听器并不在Spring容器之中,所以无法使用@Autowired注入,使用ApplicationContext获取;
2>在监听器中更改数据库记录,需要在事务中进行,在方法上添加@Transactional不起作用。

4.参考文章

1.ajax请求重定向---亲测有效;

2.Java在listener(监听器) 中使用Spring容器注入bean

你可能感兴趣的:(Token+Session实现不同后台系统单点登录)