Cookie:
Cookie是保存在客户端计算机上的文本文件,保留了各种跟踪信息,Servlet支持Http Cookie的多种操作。
识别返回用户的三个步骤:
1、服务器脚本向浏览器发送一组Cookie。
2、浏览器将这些信息存储在本机计算机上,后面可以获取使用。
3、当下一次浏览器向Web服务器发送任何请求时,浏览器会把这些Cookie信息发送到服务器,服务器将使用这些信息来识别用户。
Cookie处理需要对中文进行编码和解码操作:
编码操作:
String str1 = java.net.URLEncoder.encode("需要编码的字符","UTF-8");
解码操作:
String str2 = java.net.URLDecoder.decode("编码后的字符串","UTF-8");
Servlet提供的操作Cookie的方法:
操作Cookie的方法 | 方法的描述 |
public void setDomain(String pattern) | 设置Cookie适用的域 |
public String getDomain | 获取Cookie适用的域 |
public void setMaxAge(int expiry) | 设置cookie的过期时间(单位为秒),如果不设置,则cookie只在当前session中持续有效。 |
public int getMaxAge() | 返回cookie的最大生存周期(单位为秒),默认情况下,-1表示cookie将持续下去,直到浏览器关闭。 |
public String getName() | 返回cookie的名称,名称在创建后不能改变。 |
public void setValue(String newValue) | 设置与Cookie关联的值。 |
public String getValue() | 获取与Cookie关联的值。 |
public void setPath(String uri) | 设置cookie适用的路径,如果不指定路径,与当前相同目录下的所有URL都会返回cookie。 |
public String getPath | 获取cookie适用的路径 |
public void setSecure(boolean flag) | 该方法设置布尔值,表示cookie是否应该只在加密的(SSL)连接上使用。 |
public void setComment(String purpose) | 设置cookie的注释,该注释在浏览器向用户呈现cookie时非常有用。 |
public String getComment | 获取cookie的注释,如果cookie没有注释,返回null |
通过Servlet创建并保存Cookie:
1、创建一个Cookie对象。
通过调用带有cookie名称和值的Cookie构造函数来创建cookie对象,名称和值都是字符串,且不能包含[]()=,"/?@:;这些字符。
2、设置最大生存周期。
3、发送Cookie到HTTP响应头。
public void doGet(HttpServletRequest request,HTTPServletResponse response) throws ServletException,IOException {
Cookie cookie = new Cookie("name","tom"); //创建一个Cookie对象
cookie.setMaxAge(60*60*24*7); //设置最大生存周期
response.addCookie(cookie); //发送Cookie到HTTP响应头
}
案例:创建并保存Cookie
1、创建ServletDemo2类。
package servletdemo;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
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;
/**
* 创建并保存Cookie
* @author chengjunyu
*
*/
@WebServlet("/getFormContent")
public class ServletDemo2 extends HttpServlet{
public static final long serialVersionUID = 1L;
public ServletDemo2() {
super();
}
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
// 创建两个Cookie
Cookie name = new Cookie("name", URLEncoder.encode(request.getParameter("name"), "UTF-8"));
Cookie password = new Cookie("password", request.getParameter("password"));
// 为两个 Cookie 设置过期日期为 24 小时后
name.setMaxAge(60*60*24);
password.setMaxAge(60*60*24);
// 在响应头中添加两个 Cookie
response.addCookie(name);
response.addCookie(password);
// 设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String htmlStr = "<!DOCTYPE html>\n";
htmlStr += "<html>\n";
htmlStr += "<head><title>Cookie测试</title></head>\n";
htmlStr += "<body>\n";
htmlStr += "<p>姓名:"+request.getParameter("name")+"</p>\n";
htmlStr += "<p>密码:"+request.getParameter("password")+"</p>\n";
htmlStr += "</body></html>";
out.println(htmlStr);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
doGet(request, response);
}
}
2、修改web.xml文件,增加对ServletDemo2类的访问路径。
3、创建一个html文件,填写表单后提交到ServletDemo2访问路径。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>form表单提交后获取Cookie</title>
<style>
* {
padding: 0;
margin: 0;
}
.wrapper-outer {
margin: 100px auto;
width: 400px;
height: 200px;
border: 1px solid black;
text-align: center;
}
h2 {
padding-top: 20px;
}
.wrapper-inner {
padding-top: 30px;
font-size: 20px;
line-height: 36px;
}
.cancel,.submit {
width: 60px;
height: 28px;
}
</style>
</head>
<body>
<form class="wrapper-outer" action="/servletdemo/getFormContent" method="GET">
<h2>提交表单后获取cookie</h2>
<div class="wrapper-inner">
<p>姓名:<input type="text" value="" placeholder="请输入姓名" name="name"></p>
<p>密码:<input type="password" value="" placeholder="请输入密码" name="password"></p>
<input type="button" value="取消" class="cancel">
<input type="submit" value="提交" class="submit">
</div>
</form>
</body>
</html>
结果:
通过Servlet读取Cookie
如果要读取Cookie,需要通过调用HttpServletRequest的getCookies()方法创建一个Cookie对象的数组,然后通过循环遍历数组并使用getName()和getValue()方法来访问每个cookie和关联的值。
案例:读取ServletDemo2中创建的Cookie。
1、创建ServletDemo3类,类中包含读取Cookie的方法。
package servletdemo;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
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;
@WebServlet("/getCookies")
public class ServletDemo3 extends HttpServlet{
public static final long serialVersionUID = 1L;
public ServletDemo3() {
super();
}
public void doGet(HttpServletRequest request,HttpServletResponse response) throws
ServletException,IOException {
//获取Cookie数组
Cookie[] cookies = request.getCookies();
Cookie cookie = null;
String cookieName = null;
String cookieValue = null;
//设置响应类型
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String htmlStr = "<!DCTYPE html>\n";
htmlStr += "<html>\n";
htmlStr += "<head><title>获取Cookie值</title></head>\n";
htmlStr += "<body>\n";
//循环遍历cookies并读取值
for(int i=0;i<cookies.length;i++) {
cookie = cookies[i];
cookieName = cookie.getName();
//可能带有中文,进行解码操作
cookieValue = URLDecoder.decode(cookie.getValue(),"UTF-8");
htmlStr += "<p style='font-size:18px;line-height=28px;'>名称:"+cookieName+"</p>";
htmlStr += "<p style='font-size:18px;line-height=28px;'>值:"+cookieValue+"</p>";
}
htmlStr += "<body></html>";
out.println(htmlStr);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
doGet(request, response);
}
}
2、修改web.xml文件,增加对ServletDemo3类的访问路径。
<servlet>
<!-- 类名 -->
<servlet-name>ServletDemo3</servlet-name>
<!-- 类所在的包 -->
<servlet-class>servletdemo</servlet-class>
</servlet>
<servlet-mapping>
<!-- 类名 -->
<servlet-name>ServletDemo3</servlet-name>
<!-- 访问路径 -->
<url-pattern>/servletdemo/getCookies</url-pattern>
</servlet-mapping>
结果:
通过Servlet删除Cookie:
如果需要删除Cookie,只需要读取一个现有的cookie,并且将其保存到Cookie对象中,然后使用setMaxAge()方法,设置该cookie的有效事件为0,即可删除现有的Cookie,设置完成后,将这个cookie通过addCookie()方法添加到头消息中。
案例:删除Cookie信息
1、创建ServletDemo4 类,类中包含了删除Cookie的方法,将Cookie的有效时间设置为0。
package servletdemo;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
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;
@WebServlet("/deleteCookies")
public class ServletDemo4 extends HttpServlet{
public static final long serialVersionUID = 1L;
public ServletDemo4() {
super();
}
public void doGet(HttpServletRequest request,HttpServletResponse response) throws
ServletException,IOException {
//获取Cookie数组
Cookie[] cookies = request.getCookies();
Cookie cookie = null;
String cookieName = null;
String cookieValue = null;
//设置响应类型
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String htmlStr = "<!DCTYPE html>\n";
htmlStr += "<html>\n";
htmlStr += "<head><title>获取Cookie值</title></head>\n";
htmlStr += "<body>\n";
if(cookies != null) {
//循环遍历cookies并读取值
for(int i=0;i<cookies.length;i++) {
cookie = cookies[i];
cookieName = cookie.getName();
//可能带有中文,进行解码操作
cookieValue = URLDecoder.decode(cookie.getValue(),"UTF-8");
//对比获取到的cookie的key,值为true
if(cookieName.compareTo("password")==0) {
//设置cookie的有效期为0s
cookie.setMaxAge(0);
//将无效cookie记录
response.addCookie(cookie);
}
htmlStr += "<p style='font-size:18px;line-height=28px;'>名称:"+cookieName+"</p>";
htmlStr += "<p style='font-size:18px;line-height=28px;'>值:"+cookieValue+"</p>";
}
}
htmlStr += "<body></html>";
out.println(htmlStr);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
doGet(request, response);
}
}
2、在web.xml文件中增加ServletDemo4的访问路径
<servlet>
<servlet-name>ServletDemo4</servlet-name>
<servlet-class>servletdemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo4</servlet-name>
<url-pattern>/deleteCookie</url-pattern>
</servlet-mapping>
结果:
在ServletDemo4中设置Cookeie的名字等于“password”的情况下,这个cookie信息被删除,结果与预期相同,不再显示password的cookie。