javaWeb之Cookie小结
在 Servlet 规范中,常用以下两种机制完成会话跟踪
Cookie
Session
Cookie:是完成会话跟踪的一种机制
HTTP协议是一个无状态的协议-- WEB服务器本身无法识别出请求是否是同一个浏览器发出的。
作为WEB服务器,必须能够采取一种机制来唯一的标识一个用户,同时记录该用户的状态。
1)Cookie是在浏览器访问WEB服务的某一个资源时,由WEB服务器在HTTP响应消息头中附带传给浏览器的一个小文本文件。
2)底层实现原理:WEB服务器通过在HTTP响应信息中增加set-Cookie响应头字片段将Cookie信息发送给浏览器
浏览器则通过在HTTP请求信息中增加Cookie请求头字段将Cookie回传到WEB服务器。
Cookie相关的api
1-创建一个Cookie
2-设置Cookie最大失效
3-如何将Cookie传给客户端(添加Cookie)
4-设置Cookie作用范围(默认情况:可以作用在当前目录和当前目录的子目录,但不能作用在当前目录的上一级目录)
5-获取Cookie数组
方法
A:获取Cookie数组
Cookie[] ck = request.getCookies();
B:添加Cookie
Cookie ck = new Cookie("name","wjc");
ck.setPath(request.getContextPath());
C:删除Cookie
temp.setMaxAge(0);//删除Cookie 注意只能为0不能为负数
D:设置Cookie作用范围
Cookie ck = new Cookie("name","wjc");
ck.setPath(request.getContextPath());//到Cookiex这一级
Cookie的传送过程(注意必须是同一个浏览器)
首先当第一次浏览器发送请求时,请求信息是没有Cookie的而响应信息里面会常见Cookie并且将Cookie添加到Cookie存储区里面
当同一个浏览器再次发送请求时,请求信息里面就有Cookie的信息了响应信息里面也有Cookie的信息。
看图片第一次发送请求.png和第二次发送请求.png
第一次发送请求
第二次发送请求
Cookie的生命周期
默认情况下是一个会话(Session)级别的。存储在浏览器内存中,用户退出浏览器之后被删除。若希望将Cookie存储在磁盘上,
需要设置setMaxAge,以秒为单位。
会话Cookie(Cookie存储在浏览器)和持久化Cookie(Cookie存储在磁盘) 只要setMaxAge就会变为持久化Cookie
Cookie的作用范围 :
可以作用在当前目录和当前目录的子目录,但不能作用在当前目录的上一级目录
手动设置Cookie的设置范围
Cookie对象调用setPath方法来设置Cookie的作用范围
其中/代表WEB站点的根目录
cookie.setPath(request.getContextPath());
案例
A-利用Cookie在一定时间内显示用户名(类似于自动登陆)
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html >
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="doLogin.do" method="post">
<input type="text" name="name"/> <br/>
<input type="submit" value="sub">
</form>
</body>
</html>
UserxServlet.java
package cn.itcast.servlet;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class UserxServlet extends BasicServlet{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
String path = req.getServletPath();
String m = path.substring(1,path.indexOf("."));
try {
Method method = getClass().getDeclaredMethod(m,HttpServletRequest.class,HttpServletResponse.class);
method.invoke(this, req,resp);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void doLogin(HttpServletRequest req, HttpServletResponse resp) throws Exception {
// TODO Auto-generated method stub
System.out.println("doLogin");
String name = req.getParameter("name");
if(name !=null && !name.trim().equals("")){
Cookie ck = new Cookie("name",name);
ck.setMaxAge(10);
resp.addCookie(ck);
}else{
Cookie[] ck = req.getCookies();
if(ck != null&&ck.length>0){
for(Cookie k : ck){
if("name".equals(k.getName())){
name = k.getValue();
break ;
}
}
}
}
if(name !=null && !name.trim().equals("")){
req.setAttribute("name", name);
req.getRequestDispatcher("index.jsp").forward(req, resp);
}else{
resp.sendRedirect("login.jsp");
}
}
}
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String s = (String)request.getAttribute("name");
%>
<!DOCTYPE html >
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
hello : <%=s%>
</body>
</html>
B-利用Cookie按时间顺序只显示5个book的值
book.jsp
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//获取选中的书籍
String book = request.getParameter("book");
//获取
Cookie[] ck = request.getCookies();
List<Cookie> list = new ArrayList<Cookie>();
Cookie temp = null;
if(ck!=null&&ck.length>0){
for(Cookie g:ck){
if(g.getName().startsWith("Book_")){
list.add(g);
}
}
}
//加入之前以选的书本
for(Cookie g:list){
if(g.getValue().equals(book)){
temp = g;
break;
}
}
//加入之前没有的书本
if(temp == null&&list.size()>=5){
temp = list.get(0);
}
//一定要删除的Cookie
if(temp != null){
temp.setMaxAge(-5);//删除Cookie
response.addCookie(temp);
}
temp = new Cookie("Book_"+book,book);
response.addCookie(temp);
%>
<!DOCTYPE html >
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h4>Book Detail Page</h4>
Book:<%=request.getParameter("book") %>
<br/><br>
<a href="books.jsp">Return </a>
</body>
</html>
books.jsp
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html >
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
for(int i = 1;i<=11;i++){
%>
<a href="book.jsp?book=book<%=i %>">book<%=i %></a><br/><br>
<%
}
%>
<%
Cookie[] ck = request.getCookies();
if(ck!=null&&ck.length>0){
for(Cookie g:ck){
if(g.getName().startsWith("Book_")){
out.print(g.getValue()+" ");
}
}
}
%>
</body>
</html>
C-CookiePath
看代码CookiePath的read.jsp和write.jsp
这个是可以成功的
看代码CookiePath2的write1.jsp和read1.jsp
这个是不能成功的
要成功就添加ck.setPath(request.getContextPath());//到Cookiex这一级
目录结构
write.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Cookie ck = new Cookie("name","wjc");
response.addCookie(ck);
%>
<!DOCTYPE html >
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="CookiePath/read.jsp">ReadCookie</a>
</body>
</html>
read.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Cookie[] ck = request.getCookies();
String name = null;
if(ck != null && ck.length>0){
for(Cookie g:ck){
if("name".equals(g.getName())){
name = g.getValue();
}
}
}
if(name != null){
out.print(name+"<br/>");
}else{
out.print("sorry there is no Cookie");
}
%>
<!DOCTYPE html >
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
write1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 与 write.jsp代码一样-->
<%
Cookie ck = new Cookie("name","wjc");
ck.setPath(request.getContextPath());//到Cookiex这一级
response.addCookie(ck);
%>
<!DOCTYPE html >
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="../read1.jsp">ReadCookie</a>
</body>
</html>
read1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 与 CookiePath下的read.jsp代码一样 -->
<%
Cookie[] ck = request.getCookies();
String name = null;
if(ck != null && ck.length>0){
for(Cookie g:ck){
if("name".equals(g.getName())){
name = g.getValue();
}
}
}
if(name != null){
out.print(name+"<br/>");
}else{
out.print("sorry there is no Cookie");
}
%>
<!DOCTYPE html >
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>