Session 创建者 Tomcat

Session created by Tomcat

我正在学习 session 使用 servlet,我在书中读到要创建一个 session 我们需要如下调用。

HttpSession session = request.getSession()

这会导致 Web 容器创建一个 session ID 并将其发送回客户端,以便客户端可以将其附加到服务器的每个后续请求中。当我在 chrome 中根据请求 header 在网络选项卡中打开开发人员工具时,我确实看到了一个 cookie header.

Cookie: JSESSIONID=F92

下面是我在登录 servlet 中所做的

package shop;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

public class LoginServlet extends HttpServlet{
    
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        String uid = request.getParameter("uid");
        String password = request.getParameter("pwd");
        
        if(uid.equals("admin") && password.equals("admin"))
        {
            HttpSession session = request.getSession();
            System.out.println(session.getId());
            response.sendRedirect("shopping");
        }
        else
            response.getWriter().println("Invalid Credentials");
    }
    
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        this.doGet(request, response);
    }

}

Index.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>shopping application</title>
</head>
<body style="background-color:cyan">
<div style="text-align:center">
<h3>Welcome to Mart</h3>
<form action="login" method="post" name="loginform">
    <div style="padding:2px;">
        <label for="uid">Username:</label>
        <input type="text" id="uid" name="uid">
    </div>
    <div style="padding:2px;">
        <label for="pwd">Password:</label>
        <input type="password" name="pwd" id="pwd">
    </div>

    <input type="submit" value="Login">
</form>
</div>
</body>
</html>

我的问题是,即使我删除了 getSession() 调用,我仍然会在网络选项卡中看到 cookie。是否有与 tomcat 的每个请求关联的默认值 session?

在 Tomcat 上,在需要时懒惰地建立会话。基本上有两种创建会话的情况:

  • 如果您调用 request.getSession()request.getSession(true) 总是会建立一个会话,
  • 如果您根据 Tomcat 的用户数据库对用户进行身份验证,则可能会根据身份验证方法创建一个会话。最值得注意的是,如果您使用表单身份验证(请参阅 this tutorial),会话 总是 已建立,
  • JSP 页面创建会话,除非您添加 <%page session="false"%> 指令(参见 Why set a JSP page session = "false" directive?)。

浏览器会记住 cookie,因此 JSESSIONID 的存在并不表示存在会话(它可能来自之前的测试)。要测试会话是否存在,请使用 request.getSession(false)。例如:

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      final boolean establishSession = req.getParameter("withSession") != null;
      try (final PrintWriter writer = resp.getWriter()) {
         final String requestedSessionId = req.getRequestedSessionId();
         final HttpSession possibleSession = req.getSession(establishSession);
         writer.append("I requested a session with id: ")//
               .append(requestedSessionId)
               .append("\nI have a session with id: ")
               .append(possibleSession != null ? possibleSession.getId() : null)
               .println();
      }
   }

编辑: 我添加了 JSP 页面创建会话的案例。