引言
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
知识点总结
Cookie
会话技术
会话就是指浏览器从打开到关闭的过程,服务器不会自动保存我们的操作信息,这时候就需要用到会话技术(Cookie&Session)。
下面是谷歌浏览器的保存Cookie的设置页面;
概念
Cookie是客户端会话技术,可以将数据保存到客户端(浏览器);
快速实现
1.创建Cookie对象
new Cookie(String name, String value)
2.发送cookie对象
response.addCookie(Cookie cookie)
3.访问cookie对象
Cookie[] request.getCookies()
在Demo01中创建并上传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.URLEncoder;
@WebServlet("/cookieDemo01")
public class CookieDemo01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String value="helloCookie";
Cookie ck1=new Cookie("msg", value2);
response.addCookie(ck1);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
Demo02中获取
==========
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;
@WebServlet("/cookieDemo02")
public class CookieDEMO02 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cks = request.getCookies();
for (Cookie ck : cks) {
String name=ck.getName();
String value= ck.getValue();
System.out.println(name+"=="+value);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
原理
在上传cookie之后,响应行里会出现set-Cookie响应头;
获取Cookie时,请求行里也会出现Cookie请求头;
注意事项
1.一次可以发送多个Cookie
Cookie ck1=new Cookie("msg", value2);
Cookie ck2=new Cookie("msg","helloJava");
Cookie ck3=new Cookie("name","helloAXiao");
response.addCookie(ck1);
response.addCookie(ck2);
response.addCookie(ck3);
2.Cookie的存储时间
默认情况下,浏览器关闭,Cookie随之被销毁;
但是可以用 setMaxAge(int seconds) 设置Cookie存储时间
setMaxAge(int num)
--------
num>0 >> 存储时间
num<0 >>表示销毁cookie
num==0 >>默认情况
=================
Cookie ck1=new Cookie("msg", value2);
ck1.setMaxAge(60);
//60秒后销毁
response.addCookie(ck1);
3.Cookie的获取范围
1. 在一个tomcat服务器中,部署了多个web项目
* 默认情况下cookie不能共享
* setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录
* 如果要共享,则可以将path设置为"/"
2. 不同的tomcat服务器间cookie共享问题?
* setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
* setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享
4.Cookie存中文
Tomcat8之后就可以存中文了,但是特殊字符(像空格),还是要用URL编码存储;
特点
特点:
1. cookie存储数据在客户端浏览器
2. 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)
作用:
1. cookie一般用于存出少量的不太敏感的数据
2. 在不登录的情况下,完成服务器对客户端的身份识别
案例
第一次访问:
再一次访问:
代码展示
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.text.SimpleDateFormat;
import java.util.Date;
@WebServlet("/CookieDemo03")
public class CookieDemo03 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
Cookie[] cookies = request.getCookies();
boolean flag=false;//判断是否为第一次
for (Cookie cookie : cookies) {
String name=cookie.getName();
if("loginTime".equals(name)==true){
flag=true;
String time=cookie.getValue();
System.out.println("欢迎回来,您上次访问的时间是"+time);
response.getWriter().write("欢迎回来,您上次访问的时间是"+time);
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日:HH时mm分ss秒");
String str = sdf.format(date);
cookie.setValue(str);
break;
}
}
if(flag==false){
response.getWriter().write("<h1>欢迎您首次访问,祝您愉快哟</h1>");
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日:HH时mm分ss秒");
String str = sdf.format(date);
Cookie cookie=new Cookie("loginTime",str);
response.addCookie(cookie);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
Session
概念
服务器端会话技术,在一次会话的多次请求间
共享数据,将数据保存在服务器端的对象(HttpSession)中。
快速上手
1.获取HttpSession对象
HttpSession session = request.getSession();
2.使用HttpSession对象
Object getAttribute(String name)
void setAttribute(String name, Object value)
name是数据的标识符,value是数据
void removeAttribute(String name)
原理
Session的实现是依赖于Cookie的;
细节
1.客户端关闭,服务器端不关闭时,两次获取的session是同一个吗?
*默认情况下不是,因为session是依赖于cookie的,二者都是存在于一次会话中;
*可以设置cookie,键位JSESSIONID;
Cookie ck=new Cookie("JSESSIONID",session.getId());
ck.setMaxAge(60*60);
response.addCookie(ck);
2.客户端不关闭,服务器端关闭时,两次获取的session是同一个吗?
不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作
* session的钝化:
* 在服务器正常关闭之前,将session对象系列化到硬盘上
* session的活化:
* 在服务器启动后,将session文件转化为内存中的session对象即可。
3.session什么时候被销毁?
1. 服务器关闭
2. session对象调用invalidate() 。
//使session失效
4. session默认失效时间 30分钟
(web.xml中)选择性配置修改
<session-config>
<session-timeout>30</session-timeout>
</session-config>
特点
1.session用于一次会话的多次请求的数据,存在服务器;
2.session可以存储任意类型,任意大小的数据;
3.与cookie的区别
* session数据存储在服务器,cookie数据储存在客户端;
* session没有数据限制,cookie有
* session相对于cookie更安全;
案例
https://blog.csdn.net/alpha_xia/article/details/108457134