1.会话技术
2.Cookie
3.Session
一、会话技术
1.会话技术简介
会话:用户打开浏览器,浏览页面,直到关闭浏览器的过程称为一次会话。
为什么要学习会话技术?
http协议是一个无状态协议,服务器端无法记录客户端浏览器身份信息。
例如:购物网站,购物车(需要记录用户购买商品的信息)。
如何做到? request? 无法实现,会发现结账时,没有任何商品信息。
ServletContext? 无法实现,结账时会发现,所有人的商品信息都在购物车中。
因此,需要使用会话跟踪技术解决。
会话跟踪技术包括: Cookie(客户端技术)、Session(服务器端技术)
二、Cookie
1.Cookie简介
生活中常见的使用Cookie的案例:QQ记住密码、网站智能账号密码填充、百度搜索记录
作用:将数据存储到本地为了智能填充数据,还能够增强用户体验,缓解服务器压力。
(1)Cookie在哪
删除所有的本地Cookie 方法:Ctrl + shift + Delete
(2)如何给自己的网站缓存数据
response 是可以将信息返回到浏览器上,所以设置Cookie 的时候是借助Response对象将Cookie发送到本地浏览器。
获取Cookie的方法时通过reqeust 进行获取
package com.xj.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieDemo1Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建Cookie----参数name和value都是String,而且不能用非西文
Cookie cookie = new Cookie("company","QQCY");
//2.通过response将Cookie传给客户端
response.addCookie(cookie);
}
}
注:如果再创建一个Cookie,name一样,那么会覆盖原来的值。
package com.xj.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieDemo2Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取客户端带来的Cookie
//request.getCookies()获取所有Cookie
//不支持按个获取,request方法会直接将所有的cookie全部取到并返回一个数组
Cookie[] cs = request.getCookies();
for(Cookie c:cs){
//Cookie没哟提供根据name获取value的方法,提供了两个方法
System.out.println(c.getName()+":"+c.getValue());
}
}
}
2.Cookie的常用方法
构造方法: Cookie c = new Cookie("",""); 创建Cookie时, name和value都是字符串。注意:不能用中文字符串。
getName() 获得Cookie的name
getValue() 获得Cookie的value 注意:Cookie没有提供根据name获取value的方法
setMaxAge(int 秒) 设置Cookie的存活时间
setPath() 设置Cookie的有效路径
浏览器将cookie保存硬盘的路径,是各个浏览器自己制定,其他无法进行操作的。
有效路径:浏览器发送请求时,cookie的代入路径。
请求路径 等于或者包含cookie的有效路径,该cookie会在请求时被代入。
请求路径是从资源位置开始进行判断
方法名 |
描述 |
setPath(java.lang.String uri) |
设置有效路径。 设置cookie允许被访问的路径。设置的路径,以及子路径都被允许访问。 例如:setPath("/web/a/b"); http://localhost:8080/web/a/b/oneServlet,可访问(当前路径) http://localhost:8080/web/a/b/c/oneServlet,可访问(子路径) http://localhost:8080/web/a/c/oneServlet,不允许访问(无关路径) 常见设置:setPath("/") ,当前tomcat下的所有的web项目都可以访问 cookie.setPath("/"); |
3.封装查找Cookie的工具类
package com.xj.utils;
import javax.servlet.http.Cookie;
public class CookieUtils {
public static Cookie findCookieByName(Cookie[] cs,String name){
if(cs!=null){
for(Cookie c:cs){
if(name.equals(c.getName())){
return c;
}
}
}
return null;
}
}
package com.xj.servlet;
import java.io.IOException;
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 com.xj.utils.CookieUtils;
public class CookieDemo2Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cs = request.getCookies();
Cookie c = CookieUtils.findCookieByName(cs, "company");
if(c!=null){
System.out.println(c.getName()+":"+c.getValue());
}
}
}
4.设置Cookie的存活时间
上面的代码创建的Cookie,如果关闭浏览器,再访问CookieDemo2Servlet,控制台不会获取到Cookie,说明上面创建的Cookie是瞬时的。下面的代码设置Cookie的存活时间,即使关闭了浏览器,再访问CookieDemo2Servlet时,还是会获取到。
package com.xj.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieDemo1Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建Cookie
Cookie c = new Cookie("address","CHINA");
//设置存活时间,设置完成后,这个Cookie就编程持久化Cookie,保存在浏览器管理的一个磁盘文件中(保存时间为设置的时间)
c.setMaxAge(7*24*60*60);//设置7天
//把Cookie响应给客户端
response.addCookie(c);
}
}