【问题标题】: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] 睡眠被严重低估了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 2020-08-29
      • 2017-06-16
      • 2015-05-15
      相关资源
      最近更新 更多