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不起作用。