会话技术Cookie和Session
会话:指第一次请求服务器开始建立,会话建立,直到有一方断开为止
功能:在一次会话的范围内的多次请求中,共享数据
方式:
客户端:Cookie
服务器端:Session
一、cookie
1.介绍:
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给浏览器.当用户使用浏览器去访问服务器中的其他web资源时,每次请求都将携带cookie来访问.
2.原理:
- 客户端发送请求给服务器
- 服务器发送响应头set-cookie并携带数据给客户端
- 客户端将响应头携带的数据保存到客户端浏览器中
- 下一次请求客户端会使用消息头cookie数据携带给服务器
- 服务器获取消息头中的数据
3.操作:
1).创建Cookie对象
Cookie cookie = new Cookie(String name, String value);
name: 当前Cookie取的唯一名字.
value: 存储在Cookie的共享数据,只能是字符串类型.
2).把Cookie放入响应中,响应给浏览器,把共享的数据存储到浏览器中
response.addCookie(cookie);
3.)获取Cookie及里面的数据
Cookie[] cs = request.getCookie();
4.)修改Cookie中指定的属性名的属性值
A. 重新创建一个新的Cookie,创建一个同名的新的Cookie.
Cookie c = new Cookie(“currentName”, “GZY”);
B. 先获取到要修改的Cookie对象,再调用setValue(String newValue)重新设置
注意:修改Cookie中的数据,需要再次发送给浏览器. response.addCookie©;
4.细节:
1).可以创建多个cookie
2).生命周期:
默认是在关闭浏览器的时候销毁
会话Cookie: 关闭浏览器之后,Cookie就销毁了. 缺省情况
持久化Cookie: Cookie可以保存指定的时间段.
设置Cookie的最大存活时间: cookie.setMaxAge(int seconds);
seconds < 0: 关闭浏览器之后,Cookie就销毁了
seconds > 0: 存储指定的秒数.保存到硬盘
seconds = 0: 删除Cookie,
你保存了300s,想提前删除,就直接
cookie.setMaxAge(0);
3).中文问题:
Tomcat8之前不支持中文
4).共享问题
Cookie的路径
同一服务器下不同项目:
Cookie在创建的时候,会根据当前项目的路径来设置自己的路径
问题: 此时,只有在访问路径为/项目路径/下面的资源的时候,才会将该Cookie发送到服务器,一个服务器中其他项目拿不到cookie
解决方案:设置Cookie的路径
void setPath(String uri)
cookie.setPath("/");表示当前服务器的所有的资源都能够共享该Cookie信息
为什么要设置路径,当访问某些页面时,不希望携带cookie.此时就可以设置cookie的携带路径.
路径写法: /项目名称, 所有项目中添加cookie,访问时都会携带.
设置 /项目名称/p, 此时只访问/p时,才携带cookie,其他路径不携带.
不同服务器之间:
可以设置一级域名,这样两个服务器之间可以共享cookie
news.baidu.com
map.baidu.com
cookie.setDomain(“baidu.com”);
5).Cookie的缺陷
1.获取Cookie信息很麻烦
2.Cookie不支持中文
3.一个Cookie只能存储一个字符串类型的数据
4.Cookie的在浏览器中有数量的限制
5.一个浏览器对一个站点最多存储20Cookie信息
6.一个浏览器最多只能够存储300个Cookie
7.共享数据时保存在浏览器中的,容易造成数据的泄露(不安全)
6).作用:
1.一般用于储存少量不太敏感的数据
2.在不登录的情况下,完成客户端身份份识别
5.应用
package com.wangningbo.servlet;
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.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author wangningbo
* @date 2020/6/8 - 21:44
*/
public class HelloCookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
boolean flag = false;
//解决响应到浏览器的中文乱码问题
resp.setContentType("text/html;charset=utf-8");
//获取浏览器上的所有cookie
Cookie[] cookies = req.getCookies();
if (cookies!=null && cookies.length>0) {
for (Cookie cookie : cookies) {
if("time".equals(cookie.getName())){
flag=true;
//因为当初存cookie的value时,是编码过得,要在浏览器上正确显示,所以进行解码
String value = URLDecoder.decode(cookie.getValue(), "utf-8");
resp.getWriter().write("<h1>欢迎回来,您上次访问时间为"+value+"</h1>");
//得到当前时间
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
String time = simpleDateFormat.format(new Date());
//因为时间格式中有特殊符号,比如空格,这时访问会报500错误,要对它进行编码
time = URLEncoder.encode(time, "utf-8");
//相当于修改该cookie值为当前时间
cookie.setValue(time);
//设置浏览器保存cookie的秒数
cookie.setMaxAge(100);
//修改完cookie要再一次保存
resp.addCookie(cookie);
break;
}
}
}
if (cookies==null || cookies.length==0 || flag==false){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
String time = simpleDateFormat.format(new Date());
time = URLEncoder.encode(time, "utf-8");
Cookie cookie = new Cookie("time", time);
cookie.setMaxAge(100);
resp.addCookie(cookie);
resp.getWriter().write("<h1>这是您的第一次访问</h1>");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
二、session
1.内容
Session是服务器端技术,服务器在运行时可以为每一个用户的浏览器创建一个独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其他web资源时,其他web资源再从用户各自的session中取出数据为用户服务.总而言之,将数据保存在服务器.
2.Session的特点
- session 用于存储一次会话的多次请求的数据
- session 数据存储在服务器中
- session 可以存储任意类型,任意大小的数据
3.Session的原理
session是依赖于cookie会话技术的
4.Session的操作
1).获取Session对象
request.getSession(): 获取Session对象,如果没有Session对象,直接创建一个新的返回
2).设置共享数据
往Session中存储数据
session.setAttribute(String name, Object value);
从Session中取出数据
Object value = session.getAttribute(String key);
3).删除Session(用户注销登录)
- 删除Session中指定属性名的值.
session.removeAttribute(“currentName”); - 销毁Session对象(Session中所有属性都不存在了)
session.invalidate();
4).session持久化操作
HttpSession session = request.getSession();
Cookie cookie = new Cookie(“JSESSIONID”, session.getId());
cookie.setMaxAge(60*2);
response.addCookie(cookie);
session.setAttribute(“username”, username);
session.setAttribute(“password”, password);
5.细节
1.session存储数据到服务器端
2.session没有数据大小限制
3.session相比较cookie数据安全