Servlet Cookies

数据来源于网络,仅供平时查询使用

Cookie是在多个客户端请求之间持久存储的一小段信息。

Cookie具有名称,单个值和可选属性,例如注释,路径和域限定符,生存周期和版本号。

Cookie工作原理

默认情况下,每个请求都被视为新的请求。在cookie技术中,servlet响应可以添加cookie。 所以cookie存储在浏览器的缓存中。之后,如果用户发出请求,默认情况下会带上cookie。 因此,我们就可以知道用户旧用户。

Cookie类型

Servlet中有2种类型的Cookie。

  • 非持久性cookie
  • 持久性Cookie
非持久性cookie
  • 它仅适用于单个会话。当用户关闭浏览器时都会删除它。
持久性Cookie
  • 它对多个会话有效。当用户关闭浏览器时也不会删除它。只有在用户注销或注销时才被删除。

Cookie的优点

  • 维持状态最简单的技术。
  • Cookie在客户端维护。

Cookie的缺点

  • 如果从浏览器中禁用Cookie,则无法正常工作。
  • 只能在Cookie对象中设置文本信息。

Servlet Cookie的应用示例

在这个例子中,我们将用户名称(username)存储在cookie对象中,并在另一个servlet中访问它,会话对应于特定用户。所以如果从多个浏览器访问指定cookie名称,那么将得到不同的值。

打开Eclipse,创建一个动态Web项目:CookieServlet,其完整的项目结构如下 -

以下是几个主要代码文件。

文件:index.html -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

<html>
<head>
<meta charset="UTF-8">
<title>Cookies In Servlet</title>
</head>
<body>
<div style="text-align:center;">
<form action="servlet1" method="post">
用户名:<input type="text" name="username" value="xiao'qi"/><input
type="submit" value="提交" />
</form>
</div>
</body>
</html>

文件:FirstServlet.java -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package com.xq.Cookie;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


* Servlet implementation class FirstServlet
*/
@WebServlet("/FirstServlet")
public class extends HttpServlet {
private static final long serialVersionUID = 1L;


* @see HttpServlet#HttpServlet()
*/
public () {
super();
// TODO Auto-generated constructor stub
}


* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/


* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
PrintWriter out = response.getWriter();

String name = request.getParameter("username");
String username = new String(name.getBytes("ISO-8859-1"),"utf-8");

out.print("<!DOCTYPE html>rn" +
"<html>rn" +
"<head>rn" +
"<meta charset="UTF-8"><body>");
out.print("欢迎您, " + username);

Cookie ck = new Cookie("uname", username);// creating cookie object
response.addCookie(ck);// adding cookie in the response

// creating submit button

out.print("<form action='servlet2' method='post'>");
out.print("<p>Cookies已在浏览器中设置,现在跳转到第二个Servlet中读取Cookies的值。</p>");
out.print("<input type='submit' value='提交到第二个Servlet'>");
out.print("</form>");

out.close();

} catch (Exception e) {
System.out.println(e);
}
}

}

文件:SecondServlet.java -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.xq.Cookie;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


* Servlet implementation class SecondServlet
*/
@WebServlet("/SecondServlet")
public class SecondServlet extends HttpServlet {
private static final long serialVersionUID = 1L;


* @see HttpServlet#HttpServlet()
*/
public SecondServlet() {
super();
// TODO Auto-generated constructor stub
}


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
Cookie ck[] = request.getCookies();
out.print("Hello " + ck[0].getValue());
out.close();
} catch (Exception e) {
System.out.println(e);
}
}

}

文件:web.xml -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="UTF-8"?>
<web-app >
<display-name>CookieServlet</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>FServlet</servlet-name>
<servlet-class>com.xq.Cookie.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FServlet</servlet-name>
<url-pattern>/servlet1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>SServlet</servlet-name>
<servlet-class>com.xq.Cookie.SecondServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SServlet</servlet-name>
<url-pattern>/servlet2</url-pattern>
</servlet-mapping>
</web-app>

在完成上面代码编写后,部署这个Web应用程序,打开浏览器访问URL: http://localhost:8080/CookieServlet , 如是程序没有错误,应该会看到以下结果 -

提交后,看到以下界面 -

在第二个Servlet中读取的Cookies值如下 -