会话技术
会话 –> 打开浏览器/关闭浏览器 ==> 会话开始&结束
会话技术 –> 保存在一次网络交互中临时产生的数据
–> 在浏览器端和服务器端记录信息
浏览器端 –> cookie
服务器端 –> session
应用场景
自动登录、浏览记录、购物车。
为什么要有这个Cookie
http的请求是无状态。
客户端与服务器在通讯的时候,是无状态的
–> 其实就是客户端在第二次来访的时候,服务器根本就不知道这个客户端以前有没有来访问过。 为了更好的用户体验,更好的交互 [自动登录]
从公司层面讲,就是为了更好的收集用户习惯[大数据]
Cookie怎么用
运行原理:
当浏览器去访问服务器的时候,服务器可以帮浏览器创建一个键值对的数据(key-value)
其实这个键值对 就是cookie对象
当完成正常的业务逻辑之后,在响应内筒中可以将cookie进行添加
–> response对象中把这个Cookie对象带给浏览器
–> 浏览器接收这个响应后,解析,按照一定的规则进行保存(默认在内存上)
–> 当下次访问浏览器时,request.把cookie带回给服务器,服务器解析
–> 一旦关闭浏览器,再次打开已经没有cookie(默认内存)
注意事项
–> 不支持中文
–> 不能跨浏览器
–> 有大小限制,4kb
对一个网站最多接受20个cookie
这个浏览器时300个
常用方法
创建cookie
Cookie cookie = new Cookie();
服务器将cookie发送给流浪器
response.addCookie(cookie);
获取带回来的cookie
Cookie[] cookies = request.getCookies();
遍历得到每一个cookie
Cookie里的API
getName()
getValue()
response.addCookie();
会话级别
默认情况下关闭浏览器后,cookie就没有了。 —> 针对没有设置cookie的有效期。
持久化级别
cookie.setMaxAge(60 * 60 * 24 * 7); –> 设置会话时间
–> 将cookie可持久化的存储
expiry: 有效 以秒计算。
//正值 : 持久级别 表示 在这个数字过后,cookie将会失效。
//负值:会话级别 关闭浏览器,那么cookie就失效, 默认值是 -1
//0: 立即删除cookie(同名同 路径)
//赋值新的值
cookie.setValue(newValue);
//用于指定只有请求了指定的域名,才会带上该cookie
cookie.setDomain(“.itheima.com”);
cookie.setPath(“/CookieDemo”);
–> 只有访问该域名下的cookieDemo的这个路径地址才会带cookie
–> 路径是请求服务器的时候,路径的上一级
–> 默认路径是项目目录,路径即可自定义
包含关系
cookie
name /cookie
value /cookie/c
浏览器访问服务器的时候,若服务器地址是(项目/cookie/c)
–> 能获取到name value两者的内容
浏览器访问服务器的时候,若服务器地址是(项目/cookie)
–> 只能获取name的内容
==> 判断当前的请求路径是不是与cookie的路径有包含关系
若访问路径被包含,可以获取
若为包含,则无法获取
删除cookie
//删除name的cookie
//创建同名的cookie
Cookie cookie = new Cookie(“name”, null);
//同路径
cookie.setPath(“/develop_iservlet_cookiesession”);
//设置存活时间
cookie.setMaxAge(0);
//告知浏览器
response.addCookie(cookie);
简单使用:
客户端添加Cookie
1. 在响应的时候,添加cookie
Cookie cookie = new Cookie(“aa”, “bb”);
//给响应,添加一个cookie
response.addCookie(cookie);
–> 可以为客户返回多个cookie
- 客户端收到的信息里面,响应头中多了一个字段 Set-Cookie
获取客户端的Cookie
//获取客户端带过来的cookie
Cookie[] cookies = request.getCookies();
if(cookies != null){
for (Cookie c : cookies) {
String cookieName = c.getName();
String cookieValue = c.getValue();
System.out.println(cookieName + ” = “+ cookieValue);
}
}
例子一 显示最近访问的时间。
1. 判断账号是否正确
2. 如果正确,则获取cookie。 但是得到的cookie是一个数组, 我们要从数组里面找到我们想要的对象。
3. 如果找到的对象为空,表明是第一次登录。那么要添加cookie
4. 如果找到的对象不为空, 表明不是第一次登录。
public class LastTimeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(“text/html;charset=UTF-8”);
//尝试获取cookie
Cookie cookie = getCookie(request);
//如果空,第一次
if (cookie == null){
//完成第一次的访问
response.getWriter().write(“首次访问”);
}else{
//获取value
String value = cookie.getValue();
//解析时间(毫秒值),再次存储到cookie中
Date date = new Date(Long.parseLong(value));
response.getWriter().write(“上次访问时间是:——” + date.toLocaleString());
}
cookie = new Cookie(“lastTime”,new Date().getTime() + “”);
response.addCookie(cookie);
}
//封装方法,获取cookie
public Cookie getCookie(HttpServletRequest request){
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0){
for (Cookie cookie : cookies) {
if (cookie.getName().equals(“lastTime”)){
return cookie;
}
}
}
return null;
}
}
例子二: 显示商品浏览记录。
准备工作
拷贝基础课第一天的 htmll原型文件,到工程的WebContent里面。
在WebContent目录下新建一个jsp文件, product_list.jsp, 然后拷贝原来product_list.html的内容到jsp里面。 建好之后,jsp里面的所有ISO-8859-1 改成 UTF-8
拷贝html标签的所有内容。 替换jsp的html标签即可
修改product_info.htm里面的手机数码超链接地址 product_list.jsp
- 手机数码(current)
- 修改首页(index.html)顶部的手机数码跳转的位置为 product_list.jsp
- 手机数码(current)
-
Java代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取当前用户准备浏览的ID String id = request.getParameter("id"); //获取cookie数组 Cookie[] cookies = request.getCookies(); //使用工具包,获取想要的对象 Cookie cookie = CookieUtil.findCookie(cookies, "history"); //第一次浏览 if(cookie == null) { //1.响应返回cookie Cookie c = new Cookie("history",id); //设置有效期 c.setMaxAge(60*60*24*7); //设置访问这个工程的时候,才会带cookie过来 c.setPath("/CookieDemo02"); response.addCookie(c); //2.跳转到具体界面
// response.sendRedirect(“product_info.html”);
}else {
//获取以前的cookie,因为以前的cookie,包含了浏览记录
String ids = cookie.getValue();
//让现在浏览的商品,和以前浏览的商品,形成cookie新的值
cookie.setValue(id + “#” +ids);
//设置有效期
cookie.setMaxAge(60*60*24*7);
//设置访问这个工程的时候,才会带cookie过来
cookie.setPath(“/CookieDemo02”);
response.addCookie(cookie);
}
// 3.跳转到具体界面
response.sendRedirect(“product_info.htm”);
}Jsp 里面使用Java代码
● jsp
Java Server Pager —> 最终会翻译成一个类, 就是一个Servlet
● 定义全局变量
<%! int a = 99; %>
● 定义局部变量
<% int b = 999; %>
● 在jsp页面上,显示 a 和 b的值,
<%=a %> <%=b %>清除浏览记录
其实就是清除Cookie, 删除cookie是没有什么delete方法的。只有设置maxAge 为0 。
Cookie cookie = new Cookie(“history”,”“);
cookie.setMaxAge(0); //设置立即删除
cookie.setPath(“/CookieDemo02”);
response.addCookie(cookie);Cookie总结
- 服务器给客户端发送过来的一小份数据,并且存放在客户端上。
- 获取cookie, 添加cookie
request.getCookie();
response.addCookie(); - Cookie分类
会话Cookie 默认情况下,关闭了浏览器,那么cookie就会消失。
持久Cookie
在一定时间内,都有效,并且会保存在客户端上。
cookie.setMaxAge(0); //设置立即删除
cookie.setMaxAge(100); //100 秒 - Cookie的安全问题。
由于Cookie会保存在客户端上,所以有安全隐患问题。
Cookie的大小与个数有限制。 为了解决这个问题 —> Session .