前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Undertow 如何自定义SessionId

Undertow 如何自定义SessionId

作者头像
只喝牛奶的杀手
发布2021-06-10 10:15:56
1.3K0
发布2021-06-10 10:15:56
举报

说到Session,楼主刚毕业那会儿,第一次踏上北漂的路,面试题其中有一道就是浏览器禁用Cookie,Session还能用吗?为什么?网上很多关于如何自定义SessionId的name,比如想把JSESSIONID改为"666"。但是如何自定义生成SessionId的算法?Google了一下,没找到。需要看看SpringBoot里面的embedded.undertow内部实现?

解决这个问题大致思路是:

  1. 通过重写HttpServletRequest里面的HttpSession getSession() 方法,filter里面包装
  2. 覆盖embedded.undertow生产SessionId的方法

个人觉得第一种没有第二种实现优雅,接下来会把第二种思路详细一点。如果找不到,我们就一步一步Debug。

找到Undertow的默认使用的生成器SecureRandomSessionIdGenerator,默认是怎么实现的呢?感兴趣的可以再深入一下。DeploymentInfo里面的sessionIdGenerator 属性:

代码语言:javascript
复制
private SessionIdGenerator sessionIdGenerator = new SecureRandomSessionIdGenerator();

DeploymentInfo里面属性的赋值采用Builder模式赋值,SessionIdGenerator接口里面定义了createSessionId方法,如果要实现自己的生成器,实现SessionIdGenerator:

代码语言:javascript
复制
public static final CustomSessionIdGenerator INSTANCE = new CustomSessionIdGenerator();
private CustomSessionIdGenerator() {}
@Override
public String createSessionId() {
    ……
  }

到这里只是实现了自己的生成器,一定要注意生产SessionId的方式。但是怎么注入到DeploymentInfo对象里面?一定有Customizer接口,它在哪儿?我也不知道?全局搜索DeploymentInfoCustomizer,果然找到了UndertowDeploymentInfoCustomizer,源码里面的命名就是这么的优秀!

代码语言:javascript
复制
Callback interface that can be used to customize an Undertow {@link DeploymentInfo}.

接下来我们再实现一下UndertowDeploymentInfoCustomizer接口:

代码语言:javascript
复制
public class XXXUndertowDeploymentInfoCustomizer implements UndertowDeploymentInfoCustomizer {
@Override
public void customize(DeploymentInfo deploymentInfo) {
    deploymentInfo.setSessionIdGenerator(CustomSessionIdGenerator.INSTANCE);
  }
}

至于XXXUndertowDeploymentInfoCustomizer怎么注入到Spring容器,用你开心的方式。就这样开开心心的把这个问题解决了。


画个分割线、昨天考SA和一个做支付的哥们聊了聊,同时也说点最近的感悟:

  1. 躺平和划水的人职场上常有,但长时间待在一个团队就是管理者的问题。
  2. 关于业务,不缺不懂业务闷头干的程序员,代码的价值?行业+技术才是未来的方向。以后的行业:B2B、企业数字化、SaaS、供应链。
  3. 你是想赢,还是想赢的辩论?没有那么多非黑即白。一笑而过,默而成事。
  4. 决定你价值最大化的是你的价值观!
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 只喝牛奶的杀手 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档