使用 JavaServlet 创建会话,而无需创建 Cookie

Create a session using JavaServlets without creating a Cookies

提问人:Matteo B 提问时间:5/9/2023 最后编辑:Matteo B 更新时间:5/10/2023 访问量:122

问:

如何在不使用 JavaServlet 创建 cookie 的情况下创建会话?

该方法允许创建会话并创建具有 JSESSIONID 属性的 cookie。request.getSession()

现在,如果我们想处理禁用 cookie 的情况,我们可以使用命令,该命令仅在必要时将会话 ID 添加到 url 中。response.encodeURL("path")

所以:

HttpSession session = request.getSession();
String encodedURL=response.encodeURL("path")

这似乎涵盖了所有可能性,但我有一个特殊的需求:我想向用户提供不允许任何 cookie 的可能性,即使它们在浏览器中启用了它们。在这种情况下,如果禁用了 cookie,则一切正常,因为 encodeURL 会管理它。但是,如果启用了 cookie,我找不到我无法使用以前的解决方案,因为第一条指令会创建会话,从而创建 Cookie

有没有办法在不立即设置cookie的情况下创建会话

ServletContext.setSessionTrackingModes() 可能有一个解决方案,但我还没有完全找到答案。

Java 会话 Servlet 服务器

评论

0赞 Jim Garrison 5/9/2023
有用吗?getSession(false)
0赞 Matteo B 5/9/2023
感谢您的快速回复,但如果没有会话,则使用 false 属性来避免创建会话。所以不,这没有帮助
0赞 Andrew S 5/9/2023
哪个 servlet 容器?容器应(希望)支持此配置。此外,如果使用 URL 会话编码,则请注意潜在的安全问题,例如,用户共享 URL 以及过时的书签。
0赞 Matteo B 5/9/2023
我正在使用 Tomcat,因为这是一个大学项目,我不担心安全问题,对吧。
0赞 rickz 5/9/2023
你发布的内容是错误的。setSessionTrackingModes 是 ServletContext 接口的方法,而不是 HttpServletRequest。

答:

-1赞 Pedro Guille 5/9/2023 #1

您必须首先询问用户这次是否要使用 cookie,将答案保存在布尔值中,然后使用 if-else 创建带有或不带有 cookie 的会话

评论

0赞 Matteo B 5/9/2023
问题是,如果在浏览器中启用了 cookie,您如何创建会话来避免默认创建 cookie?
0赞 Matteo B 5/10/2023 #2

我创建了一个解决方法,用于创建会话,然后删除会话创建的 cookie。这样,创建会话后,用户浏览器中不会留下任何内容。

第一个操作:创建会话并获取请求的源 URL:

HttpSession session = request.getSession();
String origin = request.getHeader("referer");

第二个操作:使用 encodeURL 确保会话正常工作,即使从浏览器中禁用了 cookie:

String encodedURL = origin;
encodedURL = response.encodeURL(origin);

第三个操作:检查URL重写是否已完成,如果没有(意味着启用了cookie),则手动重写:

 if(Objects.equals(encodedURL, origin)){
            String JSESSIONID=session.getId();
            encodedURL =encodedURL +"JSESSIONID="+JSESSIONID;

第四个操作:删除 Cookie:

Cookie [] cookies= request.getCookies();
            for(Cookie i:cookies){
                i.setMaxAge(0);
                response.addCookie(i);
            }

第五个操作:使用 encodedURL 重定向:

response.sendRedirect(encodedURL);

此解决方案是部分的,因为会话创建仍会生成 cookie,但第四个操作会将其删除,从而“修复”问题。