session管理

例如:密码登录和短信验证码登录都是提交表单完成的,社交账号登录是基于OAuth2协议完成的。这三种登录方式共同点就是:
登录成功之后用户信息是放在服务器session中的。
这几讲讲常见的session管理:
1.session超时处理:(用户登录之后多长时间不操作,session超时做哪些处理)

设置server.session.timeout = 10 #单位秒
不生效
原因是:
然而并没有什么用,因为SpringBoot在TomcatServletWebServerFactory代码中写了这个

1 private long getSessionTimeoutInMinutes() {
2 Duration sessionTimeout = this.getSession().getTimeout();
3 return this.isZeroOrLess(sessionTimeout) ? 0L : Math.max(sessionTimeout.toMinutes(), 1L);
4 }
把设置的时间转化成分钟和1分钟取最大值。

在springboot2.0之后,设置session超时的方式修改为在application.yml或application.xml上面添加

image.png

server.servlet.session.timeout=PT1M
PT1M 意思是设置session失效的时间是1分钟。

扩展:Duration
通过查看springboot源码发现setTimeouot方法,这里要求传入Duration的实例
public void setTimeout(Duration timeout) {
this.timeout = timeout;
}

而Duration是在Java8中新增的,主要用来计算日期差值,Duration是被final声明的,并且是线程安全的
转换字符串方式,类似于 SimpleDateFormat 的格式化日期方式 
Duration 字符串类似数字有正负之分,默认正,负以’-‘开头,紧接着’P’,下面所有字母都不区分大小写: 
‘D’ – 天 
‘H’ – 小时 
‘M’ – 分钟 
‘S’ – 秒 
字符’T’是紧跟在时分秒之前的,每个单位都必须由数字开始,且时分秒顺序不能乱,比如:P2DT3M5S,P3D,PT3S 
PT3M2S 等于 -PT-3M-2S

最后总结一下Duration最实用的一个功能其实是 between 方法,因为有很多时候我们需要计算两个日期之间的天数或者小时数,用这个就可以很方便的进行操作。

为了便于显示由于session过期引起的需要配置:

.and()
.sessionManagement().invalidSessionUrl("session/invalid") //session过期后跳转的URL
.and()

/**
* 配置session失效后跳转的url
* @return
*/
@GetMapping("/session/invalid")
@ResponseStatus(code = HttpStatus.UNAUTHORIZED)
public SimpleResponse sessionInvalid(){
String message = "session失效";
return new SimpleResponse(message);
}

2.session并发控制:(用户在A机器上登陆后,在B机器又登录,需要把A机器的session干掉)
.maximumSessions(1)//设置session最大并发数量
.maxSessionsPreventsLogin(true)//设置当session到达最大数量阻止后续的登录而不是顶掉前一个
.expiredSessionStrategy(new YunqingExpiredSessionStrategy())//设置被顶掉之后的处理

/**

  • session被别人登录顶掉之后的处理

*/
public class YunqingExpiredSessionStrategy implements SessionInformationExpiredStrategy {

@Override
public void onExpiredSessionDetected(SessionInformationExpiredEvent event) throws IOException, ServletException {

    event.getResponse().setContentType("application/json;charset=UTF-8");
    event.getResponse().getWriter().write("并发登陆");
}

}

3.集群session管理:(默认session是都放在中间件服务器里的,比如Tomcat,例如负载均衡没做session粘连处理,A机器的登录session不会被B机器知道,请求发到B机器上后还要求登陆)


image.png

解决方案如上图,把session抽取出来放到一个独立的储存里,这样哪个服务器都需要到独立的存储里去拿session.

spring-session帮助我们完成了此功能。
下图中所示,spring session支持的独立存储session的方式。


image.png

spring-session存储类型,解决session集群问题,剥离出session独立存储在redis

spring.session.store-type = redis

这里讲一下redis存储session,因为session是一个频繁访问的,是有超时时间的,要是存在数据库还要去清理,redis本身就可以设置超时时间。所以使用redis. 因为使用spring-session管理之后,session放到redis,所以验证码的实体类需要序列化。但是验证码的图片怎么序列化?如下解决:
/**
* 保存校验码
*
* @param request
* @param validateCode
/
private void save(ServletWebRequest request, T validateCode) {
/
*
* 因为图片BufferedImage类型不能序列化,所以这里取到ValidateCode不管是有没有图片,都重新new一个实例,
* 只取码和过期时间保存到session中
*/
ValidateCode code = new ValidateCode(validateCode.getCode(), validateCode.getExpireTime());
validateCodeRepository.save(request, code, getValidateCodeType(request));
}

注意这里有一个大坑:


因为我用的springboot2.1.6版本,所以使用spring-session依赖实现session共享的时候出现了很多莫名其妙的问题,后来换成了spring-session-data-redis依赖就解决了。。。。


4.退出
spring security默认的退出处理<a href="//www.greatytc.com/logout">退出</a>逻辑:
1.使当前的session失效

    2.清除与当前用户相关的rememberMe-me记录

    3.清空当前的SecurityContext

    4.重定向到登录页
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容

  • 一、登录配置 对于表单登录,能配置登录成功和失败的跳转和重定向,Spring Security通过配置可以实现自定...
    zenghi阅读 16,181评论 1 10
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,031评论 0 2
  • 一:LoadRunner常见问题整理1.LR 脚本为空的解决方法:1.去掉ie设置中的第三方支持取消掉2.在系统属...
    0100阅读 4,127评论 0 11
  • 吴宇晨: 早晨的天空阴沉沉的,操场上却洋溢着我们激情四射的欢呼声。 当信号枪响起,瞿天宸开始冲刺,他的...
    九九_3bc0阅读 238评论 0 1
  • 妈妈们总是担心自己的奶水少,七大姑八大姨说呢没奶,胸大说你没奶,胸小说你没奶,宝宝吃了哭没奶,宝宝吃了不睡没奶,奶...
    萌小豆0831阅读 334评论 0 0