我想知道是否有人在我的浏览器中禁用了cookie,然后cookie不适用于我的浏览器,那么我该如何在java中进行会话。我正在为服务器端编程编写servlet。 那我的会议如何运作?它如何识别用户?由于JSESSION ID存储在cookie中......
答案 0 :(得分:12)
请参阅HttpServletResponse encodeURL()和encodeRedirectURL()。
如果浏览器不支持cookie,这些功能将适当地重写您的URL以包含会话信息。根据您正在使用的Java Web框架,可以自动调用这些函数(只要您使用框架的方法来编写URL)。
请注意,由于在链接中显示会话ID的安全性和缓存含义,在所有情况下都可能不需要这样做。 This page在这个短片空间中比我能更好地总结了这些问题,并提供了一种禁用此功能的方法。
答案 1 :(得分:5)
您需要将jsessionid
附加到您的网络应用程序中涉及的应由客户端调用的所有网址。这包括重定向URL和JSP页面中的链接。
如果是重定向网址,您需要先使用HttpServletResponse#encodeRedirectURL()
:
response.sendRedirect(response.encodeRedirectURL("page.jsp"));
如果是JSP页面中的链接,您首先需要通过HttpServletResponse#encodeURL()
传递这些URL。您可以在JSTL的帮助下执行此操作(只需在/WEB-INF
)jstl-1.2.jar标记中删除<c:url>
,它将在幕后通过上述方法传递URL:< / p>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
...
<a href="<c:url value="page1.jsp" />">link1</a>
<a href="<c:url value="page2.jsp" />">link2</a>
...
<form action="<c:url value="servlet" />" method="post">
...
</form>
答案 2 :(得分:2)
如果禁用了cookie,您仍然可以通过将JSESSIONID的值作为查询参数发送来维护会话,例如:
http://www.mywebsite.com/somePage?JSESSIONID=389729387392
请记住,如果安全性是主要问题,那么您可能不想使用此方法,因为它会将会话ID直接放入网址。
答案 3 :(得分:2)
作为参考,我们很高兴知道html5引入sessionStorage
作为Web Storage的一部分。 24ways.org上有一篇很好的文章介绍它:Breaking Out The Edges of The Browser。
支持:
localStorage
)HTML5 (including next generation additions still in development)
答案 4 :(得分:1)
如果禁用了cookie,大多数会话提供程序会附加一个名为JSESSIONID的URL参数来维护会话状态
答案 5 :(得分:1)
正如其他人所提到的,你是servlet容器,例如tomcat,如果浏览器不允许cookie,则自动转向将JSESSIONID放入url中。它可以在tomcat中配置,正如您在answer中看到的那样。
我的建议是你只是尝试一下。立即使用您的Web应用程序,无需更改,并在禁用cookie的浏览器中运行它,看看会发生什么。
答案 6 :(得分:1)
其他答案很棒;我不需要重复。但我确实有一些额外的评论。
请不要将会话数据(整个会话)放在cookie中,而只放入会话ID,可能是哈希。人们很容易编辑cookie的内容。将会话数据保留在服务器上;可能在数据库中,如果你有很多并发用户或会话很长时间。
如果即使会话ID本身非常珍贵,您甚至可以将其放在POST参数中,从而防止它出现在URL本身中。
答案 7 :(得分:0)
查看JSP页面的标准taglib,特别是<c:url>
标记。
http://onjava.com/pub/a/pub/a/onjava/2002/05/08/jstl.html?page=2
我相信如果没有cookie,它还会处理jsession-id属性。