【问题标题】:Create session with BASIC authentication使用 BASIC 身份验证创建会话
【发布时间】:2018-02-28 21:41:06
【问题描述】:
我想编写一个 servlet,我可以用它来创建一个新会话。
servlet 要求用户使用BASIC authentication 进行身份验证并返回标准会话cookie(使用HttpServletRequest#getSession(true))。但是,如果客户端在他的下一个请求中使用接收到的会话 cookie 而不是BASIC authentication,则它不会经过身份验证。服务器识别会话,但它不包含用户信息。
我使用的是Tomcat,经过一番调试,原因也很明显:用户信息(主体)在身份验证时添加到会话中。但是,当第一次 BASIC 身份验证发生时,还没有会话存在,因为这将由 servlet 创建。有谁知道如何解决这个问题?
【问题讨论】:
标签:
servlets
basic-authentication
【解决方案1】:
睡了一晚 [1] 我相信我自己已经想出了一个可行的解决方案。如果调用客户端将遵循重定向,则以下 sn-p(使用 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 现在可用于后续请求。
请注意,在第二个响应中会话 cookie 对我来说是不同的,但查看 Tomcat 代码这似乎是故意的(成功的身份验证将始终创建一个新会话)。
[1] 睡眠被严重低估了!