使用BASIC身份验证创建会话

时间:2018-02-28 21:41:06

标签: servlets basic-authentication

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

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

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

1 个答案:

答案 0 :(得分:0)

经过一夜的睡眠[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]睡眠被低估了!