我很想知道在我的代码JSESSIONID中的什么时候创建和删除了。
public class Servlet extends HttpServlet {
public void doGet (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
String url = "";
switch (request.getParameter("action")){
case "viewCookieList":
url = "/cookieList.jsp";
break;
case "deleteAllCookies":
deleteCookies(request, response);
url = "/cookieList.jsp";
break;
}
getServletContext()
.getRequestDispatcher(url)
.forward(request, response);
}
private void deleteCookies(HttpServletRequest request, HttpServletResponse response){
Cookie[] cookies = request.getCookies();
if(cookies != null){
for(Cookie cookie : cookies){
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
}
}
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<link rel="stylesheet" href="style/main.css" type="text/css">
<title>Cookie List</title>
</head>
<body>
<h1>Cookies</h1>
<p>Here's a table with all of the cookies that this browser is sending to the current server.</p>
<table>
<tr> <th> <label class="tableHeader">
Name
</label> </th>
<th> <label class="tableHeader">
Value
</label> </th> </tr>
<c:forEach var="c" items="${cookie}">
<tr> <td> <label class="cookieName">
${c.value.name}
</label> </td>
<td> <label class="cookieValue">
${c.value.value}
</label> </td> </tr>
</c:forEach>
</table>
<a href="servlet?action=deleteAllCookies">Delete Cookies</a><br>
</body>
</html>
我通过另一个JSP上的viewCookieList操作链接访问cookieList.jsp。当我到达cookieList.jsp时,它将按预期显示cookie。如果单击一次“删除Cookie”链接,将调用deleteCookies(request, response)
,然后再次显示cookieList.jsp,但在所有外观上都没有改变。相同的JSESSIONID cookie名称显示为相同的值。
如果第二次单击“删除Cookie”链接,则不再显示JSESSIONID cookie名称和值,这表明这是第二次删除它。如果我第三次单击“删除Cookie”链接,则会显示具有新值的JSESSIONID cookie名称。这种行为似乎继续,偶数点击不显示名称或值,而奇数点击显示JSESSIONID名称具有新值。
那么什么时候创建JSESSIONID cookie以及何时删除它?
从this SO answer开始,如果在调用JSP时不存在JSESSIONID,则会创建一个新的,但是为什么要花两次迭代才能获得一个新的JSESSIONID cookie?对于一个相关的问题,如果在调用JSP时创建了一个新的JSESSIONID cookie,为什么cookie列表应该永远为空。