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 页面创建会话的案例。
我正在学习 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 页面创建会话的案例。