提问人:Matteo B 提问时间:5/9/2023 最后编辑:Matteo B 更新时间:5/10/2023 访问量:122
使用 JavaServlet 创建会话,而无需创建 Cookie
Create a session using JavaServlets without creating a Cookies
问:
如何在不使用 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() 可能有一个解决方案,但我还没有完全找到答案。
答:
您必须首先询问用户这次是否要使用 cookie,将答案保存在布尔值中,然后使用 if-else 创建带有或不带有 cookie 的会话
评论
我创建了一个解决方法,用于创建会话,然后删除会话创建的 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,但第四个操作会将其删除,从而“修复”问题。
下一个:自动验证 reCAPTCHA
评论
getSession(false)