说到Session,楼主刚毕业那会儿,第一次踏上北漂的路,面试题其中有一道就是浏览器禁用Cookie,Session还能用吗?为什么?网上很多关于如何自定义SessionId的name,比如想把JSESSIONID改为"666"。但是如何自定义生成SessionId的算法?Google了一下,没找到。需要看看SpringBoot里面的embedded.undertow内部实现?
解决这个问题大致思路是:
个人觉得第一种没有第二种实现优雅,接下来会把第二种思路详细一点。如果找不到,我们就一步一步Debug。
找到Undertow的默认使用的生成器SecureRandomSessionIdGenerator,默认是怎么实现的呢?感兴趣的可以再深入一下。DeploymentInfo里面的sessionIdGenerator 属性:
private SessionIdGenerator sessionIdGenerator = new SecureRandomSessionIdGenerator();
DeploymentInfo里面属性的赋值采用Builder模式赋值,SessionIdGenerator接口里面定义了createSessionId方法,如果要实现自己的生成器,实现SessionIdGenerator:
public static final CustomSessionIdGenerator INSTANCE = new CustomSessionIdGenerator();
private CustomSessionIdGenerator() {}
@Override
public String createSessionId() {
……
}
到这里只是实现了自己的生成器,一定要注意生产SessionId的方式。但是怎么注入到DeploymentInfo对象里面?一定有Customizer接口,它在哪儿?我也不知道?全局搜索DeploymentInfoCustomizer,果然找到了UndertowDeploymentInfoCustomizer,源码里面的命名就是这么的优秀!
Callback interface that can be used to customize an Undertow {@link DeploymentInfo}.
接下来我们再实现一下UndertowDeploymentInfoCustomizer接口:
public class XXXUndertowDeploymentInfoCustomizer implements UndertowDeploymentInfoCustomizer {
@Override
public void customize(DeploymentInfo deploymentInfo) {
deploymentInfo.setSessionIdGenerator(CustomSessionIdGenerator.INSTANCE);
}
}
至于XXXUndertowDeploymentInfoCustomizer怎么注入到Spring容器,用你开心的方式。就这样开开心心的把这个问题解决了。
画个分割线、昨天考SA和一个做支付的哥们聊了聊,同时也说点最近的感悟: