【问题标题】:How to do sessions if client doesn't accept cookies? Understanding response.encodeURL() inside Servlet如果客户端不接受 cookie,如何进行会话?了解 Servlet 中的 response.encodeURL()
【发布时间】:2021-04-24 01:07:31
【问题描述】:

我正在练习维护客户端和服务器之间的会话。为此,我使用了简单的解决方案,其中 JSESSIONID 存储在 cookie 中。所以我的小程序是这样工作的:

index.html:

<html><body>
    
    <form action="testing">
        <input type="text" name="animal">
        <button>Go</button>
    </form>
    
</body></html>

MyServlet.java(在 XML 中映射为 /testing)

public class MyServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        String name = req.getParameter("animal");
        PrintWriter pw = resp.getWriter();

        pw.print("Welcome " + name + "<br>");

        HttpSession session = req.getSession();

        if (session.isNew()) {
            pw.print("New session: " + session.getId() + "<br>");
        } else {
            pw.print("Old session: " + session.getId() + "<br>");
        }

        pw.print("<a href=\'index.html\'> Home </a>");
    }
}

所以,如果我从 FORM 提交的东西超过两次,服务器应该“找到”我存储在堆中的 JSESSIONID。这是提交 FORM 时的外观图片(我在输入中输入了“鹦鹉”):

但后来我在浏览器中禁用了 cookie。之后,我的服务器再也找不到用户的 JSESSIONID,因为用户实际上从未将其存储在任何地方。请记住,以前,JSESSIONID 存储在 cookie 中,但由于我禁用了它们,它不可能再将它存储在那里。所以现在,我被困住了。

在这种情况下我该怎么办?我遇到了response.encodeURL(),它使用 URL 并将其 JSESSIONID 附加到 URL 中。但是我很难理解如何实现它以及它是如何在内部工作的。有人可以告诉我如何使用encodeURL() 来解决这个问题,并实际解释一下在实现这样的实现后代码是如何工作的吗?

【问题讨论】:

    标签: java session servlets session-cookies urlencode


    【解决方案1】:

    根据the specification,服务器应支持几种跟踪会话的方式:使用 cookie、SSL 会话或 URL 重写。

    您询问的是 URL 重写,其工作原理如下:

    URL 重写是会话跟踪的最低公分母。当客户端不接受 cookie 时,服务器可能会使用 URL 重写作为会话跟踪的基础。 URL 重写涉及将数据(会话 ID)添加到由容器解释的 URL 路径,以将请求与会话相关联。

    会话 ID 必须编码为 URL 字符串中的路径参数。参数的名称必须是 jsessionid。下面是一个包含编码路径信息的 URL 示例:

    http://www.myserver.com/catalog/index.html;jsessionid=1234

    URL 重写会在日志、书签、引用标头、缓存的 HTML 和 URL 栏中公开会话标识符。 URL 重写不应用作支持和适用 cookie 或 SSL 会话的会话跟踪机制。

    请注意,它是一个路径参数,而不是查询参数。您的查询参数将随之而来,如下所示:

    http://www.myserver.com/catalog/index.html;jsessionid=1234?param1=value1&param2=value2&...
    

    服务器自动支持这种机制来跟踪会话,但很明显你需要帮助服务器。为此,请确保所有链接都包含 jsessionid,否则您的服务器将无法通过会话识别您的请求。

    您可以在 Java 代码中使用 encodeURL

    通过包含会话 ID 对指定的 URL 进行编码,或者,如果不需要编码,则返回未更改的 URL。此方法的实现包括确定是否需要在 URL 中编码会话 ID 的逻辑。例如,如果浏览器支持 cookie,或者会话跟踪被关闭,则 URL 编码是不必要的。

    为了进行健壮的会话跟踪,servlet 发出的所有 URL 都应通过此方法运行。否则,不支持 cookie 的浏览器无法使用 URL 重写。

    您需要在 JSP 文件中执行相同的操作。这通常通过&lt;c:url&gt; 之类的方式完成,而不是直接将 URL 写入文件:

    [...] 您可以使用 url 标记重写从 JSP 页面返回的 URL。仅当禁用 cookie 时,该标签才会在 URL 中包含会话 ID;否则,它会返回未更改的 URL。请注意,此功能要求 URL 是相对的。 [...]

    【讨论】:

      【解决方案2】:

      这是您可以做的事情。这用于将您的 JSESSIONID 附加到您将检索给用户的 url,以便他们可以在其中导航并维护他们的身份信息。关于理解它内部的工作原理很简单,就像你看到的那样,它只是将 id 附加到你传递的 url,用户信息是如何存储的,是你在服务器端的功能,你将在接下来使用用户提供的 id请求向他们检索信息。

      /**
      * Almost minimal processing for a servlet.
      *
      * @param nextUrl The url the caller would like to go to next. If
      *                supplied, put an encoded url into the returned
      *                html page as a hyperlink.
      */
      @Override
      protected void doGet(HttpServletRequest req, HttpServletResponse resp)
         throws ServletException, IOException {
      
         resp.setContentType("text/plain");
         PrintWriter out = resp.getWriter();
         out.print("OK");
      
         String param = req.getParameter("nextUrl");
         if (param!=null) {
             // append an encoded url to carry the sessionids
             String targetUrl = resp.encodeURL(param);
             out.print(". You want to go <a href=\"");
             out.print(targetUrl);
             out.print("\">here next</a>.");
         }
      }
      

      编辑: 你把它放在你的这部分代码中

      pw.print("<a href=\'" + resp.encodeURL("index.html") + "\'>Home</a>");
      

      【讨论】:

        猜你喜欢
        • 2011-07-28
        • 1970-01-01
        • 2011-12-13
        • 1970-01-01
        • 2022-01-08
        • 1970-01-01
        • 2014-05-26
        • 2010-11-26
        • 1970-01-01
        相关资源
        最近更新 更多