Cookie-Session:会话技术
会话:客户端和服务器端的对话,一次会话中包含多次请求和响应。
*一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到一方断开为止。
*会话用于在一次会话过程中共享数据
共享数据的方式
1.客户端会话技术:Cookie
2.服务器端会话技术:Session
Cookie
概念:客户端会话技术,将数据保存在客户端
Cookie原理
基于相同头set-cookie和请求头cookie实现
响应中设置响应头,浏览器将头中的数据保存在浏览器上。
第二次请求中浏览器自动将请求头cookie发送,服务器利用api直接获取数据,不需要再单独对请求头操作简化开发
使用步骤
1.创建Cookie对象,绑定数据
new Cookie(String name,String value)
2.发送Cookie对象
response.addCookie(Cookie cookie)
3.获取Cookie对象,拿到数据
request.getCookie() 返回一个Cookie数组,拿到所有的Cookie
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建Cookie对象
Cookie c = new Cookie("msg","hello");
//2.发送Cookie
response.addCookie(c);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
@WebServlet("/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//3. 获取Cookie
Cookie[] cs = request.getCookies();
//获取数据,遍历Cookies
if(cs != null){
for (Cookie c : cs) {
String name = c.getName();
String value = c.getValue();
System.out.println(name+":"+value);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
cookie的细节
1.一次可不可以发送多个cookie?
@WebServlet("/cookieDemo3")
public class CookieDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建Cookie对象,创建多个即可
Cookie c1 = new Cookie("msg","hello");
Cookie c2 = new Cookie("name","zhangsan");
//2.发送Cookie
response.addCookie(c1);
response.addCookie(c2);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
2.cookie在浏览器中保存多久?
1.默认情况下,浏览器关闭即被销毁。
2.设置进行持久化处理 Cookie对象的方法:setMaxAge(int seconds)
@WebServlet("/cookieDemo4")
public class CookieDemo4 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建Cookie对象
Cookie c1 = new Cookie("msg","setMaxAge");
//2.设置cookie的存活时间
//c1.setMaxAge(30);//将cookie持久化到硬盘,30秒后会自动删除cookie文件
//c1.setMaxAge(-1);//默认值
//c1.setMaxAge(300);
c1.setMaxAge(0);//删除Cookie信息
//3.发送Cookie
response.addCookie(c1);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
3.cookie可不可以使用中文?
tomcat8之前不可,8后可以。
4.cookie获取范围多大?
若tomcat中部署了多个项目,在不同项目中是获取不到对方的cookie信息的(默认情况)。
setPath(String path):设置cookie的范围,默认是设置当前的虚拟目录,若要共享则将path设置为“/”
@WebServlet("/cookieDemo5")
public class CookieDemo5 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建Cookie对象
Cookie c1 = new Cookie("msg","你好");
//设置path,让当前服务器下部署的所有项目共享Cookie信息
c1.setPath("/");
//3.发送Cookie
response.addCookie(c1);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
不同的tomcat间的共享问题
调用setDomain(String path)设置域名,如果设置一级域名相同则多个服务器之间的cookie可以共享。
Cookie特点和作用
1.cookie存储数据在客户端浏览器
2.浏览器对单个cookie的大小有限制,以及对同一个域名下的cookie数量也有限制
作用
1.用于少量不敏感的数据
2.在不登录的情况下,完成服务器对客户端的身份识别(比如浏览百度页面设置字体这些,没登陆下一次搜索也会是改后的情况)。
Cookie案例
记住上一次访问的时间
需求:
1. 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。
2. 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串
分析:
1. 可以采用Cookie来完成
2. 在服务器中的Servlet判断是否有一个名为lastTime的cookie
*1. 有:不是第一次访问
1. 响应数据:欢迎回来,您上次访问时间为:2021年04月10日11:50:20
2. 写回Cookie:lastTime=2021年04月10日11:50:01
*2. 没有:是第一次访问
1. 响应数据:您好,欢迎您首次访问
2. 写回Cookie:lastTime=2021年04月10日11:50:01
package cn.itcast.cookie;
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;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
在服务器中的Servlet判断是否有一个名为lastTime的cookie
1. 有:不是第一次访问
1. 响应数据:欢迎回来,您上次访问时间为:2018年6月10日11:50:20
2. 写回Cookie:lastTime=2018年6月10日11:50:01
2. 没有:是第一次访问
1. 响应数据:您好,欢迎您首次访问
2. 写回Cookie:lastTime=2018年6月10日11:50:01
*/
@WebServlet("/cookieTest")
public class CookieTest extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应的消息体的数据格式以及编码
response.setContentType("text/html;charset=utf-8");
//1.获取所有Cookie
Cookie[] cookies = request.getCookies();
boolean flag = false;//没有cookie为lastTime
//2.遍历cookie数组
if(cookies != null && cookies.length > 0){
for (Cookie cookie : cookies) {
//3.获取cookie的名称
String name = cookie.getName();
//4.判断名称是否是:lastTime
if("lastTime".equals(name)){
//有该Cookie,不是第一次访问
flag = true;//有lastTime的cookie
//设置Cookie的value
//获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = sdf.format(date);
System.out.println("编码前:"+str_date);
//URL编码 解决tomcat对特殊字符造成的错误
str_date = URLEncoder.encode(str_date,"utf-8");
System.out.println("编码后:"+str_date);
cookie.setValue(str_date);
//设置cookie的存活时间 持久化存储
cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
response.addCookie(cookie);
//响应数据
//获取Cookie的value,时间
String value = cookie.getValue();
System.out.println("解码前:"+value);
//URL解码: 因为前面编码了,所以得对应接嘛否则读取不到
value = URLDecoder.decode(value,"utf-8");
System.out.println("解码后:"+value);
response.getWriter().write("<h1>欢迎回来,您上次访问时间为:"+value+"</h1>");
break;
}
}
}
if(cookies == null || cookies.length == 0 || flag == false){
//没有,第一次访问
//设置Cookie的value
//获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = sdf.format(date);
System.out.println("编码前:"+str_date);
//URL编码 解决tomcat对特殊字符造成的错误
str_date = URLEncoder.encode(str_date,"utf-8");
System.out.println("编码后:"+str_date);
Cookie cookie = new Cookie("lastTime",str_date);
//设置cookie的存活时间
cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
response.addCookie(cookie);
response.getWriter().write("<h1>您好,欢迎您首次访问</h1>");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
JSP
概念:JAVA服务器端页面,可以理解为一个特殊的页面。其中既可以定义jsp标签又可以编写JAVA代码。用于简化书写。
原理:本质上是一个Servlet(只有Servlet的JAVA内容能被外界知晓)。
JSP的脚本:JSP定义JAVA代码的方式
1.<% 代码 %>:定义的代码在service中,可以定义service中可以定义的东西。
2.<%! 代码 %>:定义的JAVA代码在JSP转换后的JAVA类的成员位置(成员变量,成员方法)。
3.<%= 代码 %>:输出语句,会把代码的值输出到页面上。输出语句中可以定义什么,脚本中就可以定义什么
JSP的内置对象:在JSP页面中不需要创建和获取,可以直接使用的对象。
1.request
2.response
3.out:可以将数据输出到页面上。和response.getWriter()类似。
*response定义的输出会先于Out输出。
Session
概念:服务器端会话技术,在一次会话(关闭浏览器就没了)的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession。
快速入门:
1.获取HttpSession对象:
HttpSession session = request.getSession();
2.HttpSession对象:
Object getAttribute(String name)
void setAttribute(String name,Object value)
void removeAttribute(String name)
@WebServlet("/sessionDemo1")
public class SessionDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用session共享数据
//1.获取session
HttpSession session = request.getSession();
//2.存储数据
session.setAttribute("msg","hello session");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
@WebServlet("/sessionDemo2")
public class SessionDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用session获取数据
//1.获取session
HttpSession session = request.getSession();
//2.获取数据
Object msg = session.getAttribute("msg");
System.out.println(msg);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
Session原理
Session是依赖于Cookie的。服务器通过Cookie确保Session对象是同一个(用ID)
Session的细节
1.当客户端关闭后,服务器不关闭,两次关闭的session不是同一个
默认情况下不是,客户端关闭默认会话结束,所以不是同一个。
若想要客户端关闭后session也能一样,可以创建一个cookie(JSESSIONID,session.getId());然后设置cookie的存活时间,最后response.addCookie()即可。
2.客户端不关闭,服务器关闭后,两次获取的session
不是同一个,因为服务器关闭后内存中的session被销毁了。要确保数据不丢失可以使用钝化和活化(tomcat自动解决)。
session的钝化:在服务器关闭前将session对象系列化到硬盘上
session的活化:在服务器启动后,将session文件转化到内存中的session对象即可。
3.session的失效时间
1.服务器关闭
2.session对象调用invalidate()自杀。
3.session默认失效时间30min。tomcat中可以配置。
session的特点
1.session用于存储一次会话的多次请求的数据,存在服务器端。
2.session可以存储任意类型,任意大小的数据。