html会话创建于,使用BASIC身份验证创建会话(示例代码)

我想写一个servlet,我可以用它来创建一个新的会话。

servlet要求用户使用BASIC authentication进行身份验证并返回标准会话cookie(使用HttpServletRequest#getSession(true))。但是,如果客户端在其下一个请求中使用收到的会话cookie而不是BASIC authentication,则不会对其进行身份验证。服务器识别会话但不包含用户信息。

我正在使用Tomcat,经过一些调试后,原因也很明显:用户信息(Principal)在认证时被添加到会话中。但是,当第一次BASIC身份验证发生时,没有会话存在,因为这将由servlet创建。有谁知道如何解决这个问题?

答案

经过一夜的睡眠[1],我相信自己已经想出了一个有效的解决方案。下面的代码片段(使用JAX-RS,但是将它转换为普通的servlet代码应该不会太难)如果调用客户端将遵循重定向,那么这样做很有用:

public Response getSessionCookie() {

boolean sessionExists = m_servletRequest.getSession(false) != null;

if (sessionExists) {

return Response.noContent().build();

} else {

HttpSession session = m_servletRequest.getSession();

return Response.status(Status.TEMPORARY_REDIRECT)

.header("Location",

m_uriInfo.getAbsolutePathBuilder().matrixParam("jsessionid", session.getId()).build())

.build();

}

}

第一个请求将创建一个会话并将客户端重定向到相同的地址,但URL中的会话ID(这很重要)。客户端将遵循请求并再次发送相同的BASIC身份验证数据,但现在它将在现有会话中注册。上面方法的第二次调用将返回一个空响应,其中会话cookie现在可用于后续请求。请注意,在第二个响应中,会话cookie对我来说是不同的,但是看看Tomcat代码,这似乎是故意的(成功的身份验证将始终创建一个新的会话)。

[1]睡眠被低估了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值