Servlet中的Cookie使用
Cookie就是存储在客户端的一小段文本。
Cookie包含名称,单个值和可选属性,例如注释,路径和域限定符,有效时长和版本号等信息。
1 Cookie运行原理
默认情况下,每个请求都被视为一个新请求。在Cookie技术中,我们通过来自Servlet的响应添加Cookie。因此,Cookie存储在浏览器的缓存中。之后,如果用户发送了请求,则默认情况下将Cookie与请求一起发送过来。这样,服务器就可以识别用户为旧用户。
2 Cookie的分类
Servlet中有两种Cookie。
- 非永久性Cookie
- 永久性Cookie
2.1 非永久性Cookie
它仅对当前单个会话有效。每次用户关闭浏览器时都会将其删除。
2.2 永久性Cookie
它在多次会话中都有效。用户每次关闭浏览器时都不会将其删除。仅在用户注销将其删除。
3 Cookie的优势
- 维持状态的最简单技术。
- Cookies在客户端维护。
4 Cookie的特点
- 如果从浏览器禁用cookie,它将无法正常工作。
- Cookie对象中只能设置文本(字符串)信息。
5 Cookie的API
javax.servlet.http.Cookie类提供使用cookie的功能。它为cookie提供了许多有用的方法。
5.1 Cookie类的构造方法
构造方法 | 说明 |
---|---|
Cookie() | 构造一个Cookie。 |
Cookie(String name, String value) | 构造包含指定名称和值的Cookie。 |
5.2 Cookie类的普通方法
方法名称 | 说明 |
---|---|
public void setMaxAge(int expiry) | 设置Cookie的最长使用期限(以秒为单位)。 |
public String getName() | 返回Cookie的名称。创建后不能更改名称。 |
public String getValue() | 返回Cookie的值。 |
public void setName(String name) | 更改Cookie的名称。 |
public void setValue(String value) | 更改Cookie的值。 |
6 操作Cookie的方法
为了添加Cookie或获取Cookie的值,我们需要其他接口提供的一些方法。如下:
- public void addCookie(Cookie ck):HttpServletResponse接口的方法用于在响应对象中添加Cookie。
- public Cookie[] getCookies():HttpServletRequest接口的方法用于从浏览器返回所有Cookie。
7 创建Cookie的方法
创建Cookie的示例:
Cookie ck=new Cookie("user","yiidian");//创建Cookie对象
response.addCookie(ck);//把Cookie添加到响应中
8 删除Cookie的方法
删除cookie的代码示例,它主要用于注销或注销用户:
Cookie ck=new Cookie("user","");//删除指定name的Cookie值
ck.setMaxAge(0);//把时长改为0
response.addCookie(ck);//把Cookie添加到响应中
9 读取所有Cookie
获取所有Cookie的简单示例:
Cookie ck[]=request.getCookies();
for(int i=0;i<ck.length;i++){
out.print("<br>"+ck[i].getName()+" "+ck[i].getValue());//打印输出Cookie的name和value
}
10 Cookie的案例
在下面示例中,我们将用户名存储在Cookie对象中,并在另一个Servlet中获取这些Cookie数据。因为每个用户的Cookie数据是存在浏览器中的。所以,如果您使用不同的浏览器,则会得到不同的Cookie值。
10.1 编写页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="UTF-8">
<title>一点教程网-Cookie的案例</title>
<meta http-equiv="content-type" content="text/html" charset="UTF-8">
</head>
<body>
<form action="servlet1" method="post">
用户名:<input type="text" name="userName"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
10.2 编写FirstServlet
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
/**
* 一点教程网 - http://www.yiidian.com
*/
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try{
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String n=request.getParameter("userName");
out.print("欢迎 "+n);
Cookie ck=new Cookie("uname",n);//创建Cookie对象
response.addCookie(ck);//把Cookie添加到响应
//创建提交按钮
out.print("<form action='servlet2'>");
out.print("<input type='submit' value='提交'>");
out.print("</form>");
out.close();
}catch(Exception e){
System.out.println(e);
}
}
}
10.3 编写SecondServlet
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 一点教程网 - http://www.yiidian.com
*/
public class SecondServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try{
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
Cookie ck[]=request.getCookies();
for(Cookie c:ck){
if(c.getName().equals("uname")){
out.print("你好 "+c.getValue());
}
}
out.close();
}catch(Exception e){
System.out.println(e);
}
}
}
10.4 配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/servlet1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>SecondServlet</servlet-name>
<servlet-class>SecondServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SecondServlet</servlet-name>
<url-pattern>/servlet2</url-pattern>
</servlet-mapping>
</web-app>
10.5 运行测试
点击提交,看到下面效果:
再次点击提交,效果如下:
热门文章
优秀文章