Servlet – Cookie
Cookie 是在多次请求期间以键值对格式存储到客户端浏览器的文本信息。它是会话跟踪中的状态管理技术之一。基本上,服务器将每个客户端请求视为一个新请求,因此使用 cookie 来避免这种情况。当客户端生成请求时,服务器会使用具有 id 的 cookie 给出响应,然后将其存储在客户端的浏览器中。因此,如果客户端生成第二个请求,则具有匹配 id 的 cookie 也会发送到服务器。服务器将获取 cookie id,如果找到它会将其视为旧请求,否则该请求将被视为新请求。
在Java中使用 Cookie
- 为了在Java中使用 cookie,请使用javax.servlet.http包中的 Cookie 类。
- 要制作 cookie,请创建 Cookie 类的对象并传递名称及其值。
- 要在响应中添加 cookie,请使用 HttpServletResponse 接口的 addCookie(Cookie) 方法。
- 要获取 cookie,请使用请求接口的 getCookies() 方法。
Cookies 中的方法
- clone():覆盖标准Java.lang.Object.clone 方法以返回此 Cookie 的副本。
- getComment():返回描述此 cookie 用途的注释,如果 cookie 没有注释,则返回 null。
- getDomain():获取此 Cookie 的域名。
- getMaxAge():获取此 Cookie 的最大年龄(以秒为单位)。
- getName():返回 cookie 的名称。
- getPath():返回浏览器返回此 cookie 的服务器上的路径。
- getSecure():如果浏览器仅通过安全协议发送 cookie,则返回 true;如果浏览器可以使用任何协议发送 cookie,则返回 false。
- getValue():获取此 Cookie 的当前值。
- getVersion():返回此 cookie 所遵循的协议版本。
- setValue(String newValue):为这个 Cookie 分配一个新值。
- setVersion(int v):设置此 Cookie 所遵循的 cookie 协议的版本。
例子
研究所的名称使用 Cookie 从 Servlet 1 传递给 Servlet 2。
HTML
TODO supply a title
Java
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
public class Servlet1 extends HttpServlet {
protected void
processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
out.println("");
out.println("");
out.println("");
out.println("Servlet Servlet1 ");
out.println("");
out.println("");
// Creating a string to store the name
String name = request.getParameter("name");
out.println(" Hello, welcome to " + name
+ "
");
out.println(
"Go to Servlet2
");
// Creating a cookie
Cookie c = new Cookie("user_name", name);
response.addCookie(c);
out.println("");
out.println("");
}
}
}
Java
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
public class Servlet2 extends HttpServlet {
protected void
processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
out.println("");
out.println("");
out.println("");
out.println("Servlet Servlet2 ");
out.println("");
out.println("");
// Fetching cookies(if found more than one)
// Array of Cookies
Cookie[] cookies = request.getCookies();
boolean f = false;
String name = "";
if (cookies == null) {
out.println(
"You are new user, go to home page and submit your institute's name");
return;
}
else {
for (Cookie c : cookies) {
String tname = c.getName();
if (tname.equals("user_name")) {
f = true;
name = c.getValue();
}
}
}
if (f) {
out.println(" Hello, welcome back "
+ name + "
");
out.println("Thank you!!
");
}
else {
out.println(
"You are new user, go to home page and submit your institute's name");
}
out.println("");
out.println("");
}
}
}
Java
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
public class Servlet1 extends HttpServlet {
protected void
processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
out.println("");
out.println("");
out.println("");
out.println("Servlet Servlet1 ");
out.println("");
out.println("");
// Creating a string to store the name
String name = request.getParameter("name");
out.println(" Hello, welcome to " + name
+ "
");
out.println(
"Go to Servlet2
");
// Creating a cookie
Cookie c = new Cookie("user_name", name);
response.addCookie(c);
out.println("");
out.println("");
}
}
}
Java
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
public class Servlet2 extends HttpServlet {
protected void
processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
out.println("");
out.println("");
out.println("");
out.println("Servlet Servlet2 ");
out.println("");
out.println("");
// Fetching cookies(if found more than one)
// Array of Cookies
Cookie[] cookies = request.getCookies();
boolean f = false;
String name = "";
if (cookies == null) {
out.println(
"You are new user, go to home page and submit your institute's name");
return;
}
else {
for (Cookie c : cookies) {
String tname = c.getName();
if (tname.equals("user_name")) {
f = true;
name = c.getValue();
}
}
}
if (f) {
out.println(" Hello, welcome back "
+ name + "
");
out.println("Thank you!!
");
}
else {
out.println(
"You are new user, go to home page and submit your institute's name");
}
out.println("");
out.println("");
}
}
}
如果直接在隐身模式下运行 servlet2 链接,则无法识别 cookie,并将其视为新用户。
饼干的缺点
- 空格字符和图像被视为无效。
- 安全性较低。