Javaweb会话跟踪技术(Cookie和Session)
目录
一、会话跟踪技术概述
二、Cookie
1.Cookie基本原理
2.Cookie基本使用
3.Cookie存活时间
三、Session
1.Session钝化、活化
2.Session基本使用
3.sesion销毁
四Cookie和Sesion区别
一、会话跟踪技术概述
1.会话:用户打开浏览器,访问网页资源,会话就建立了。直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
2.会话跟踪:一种维护浏览器状态的方法,服务器需要多次识别请求是否来自同一个浏览器,以便在同一次会话中的多次请求共享数据。
3.为什么要共享数据?
答:因为HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据共享。
4.实现方式
客户端会话跟踪技术:Cookie
服务端会话跟踪技术:Session
二、Cookie
1.Cookie基本原理
cookie的实现是基于HTTP协议的
发送cookie到浏览器:响应头:set-cookie
携带cookie访问服务器:请求头:cookie
2.Cookie基本使用
Cookie:客户端会话技术,将技术保存到客户端,以后每次请求都携带Cookie数据进行访问
ps:我们主要是做服务端的开发,那么使用这个Cookie。首先就是要把这个Cookie发送到客户浏览器,以后客户浏览器就可以获取这个Cookie去进行访问其他的Servlet。
使用response对象
package com.project.JavaScript;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/res")
public class res extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//发送Cookie
//1.创建Cookie对象
Cookie cookie = new Cookie("username","666");
//2.发送Cookie,response
response.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
查看方法:F12或者检测--应用程序--查看cookie就可以看到了(这是edge浏览器)
使用request对象
package com.project.JavaScript;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/res")
public class res extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取Cookie
//1.获取Cookie数组
Cookie[] cookies = request.getCookies();
//2.遍历数组
for (Cookie cookie : cookies) {
//获取键
String name = cookie.getName();
//获取值,要先判断一下需要的值获取出来就好了
if ("username".equals(name)){
//获取对应的值
String value = cookie.getValue();
//打印
System.out.println(name+":"+value);
//获取到了对应的值就终止
break;
}
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
运行结果:控制台输出
username:666
3.Cookie存活时间
默认情况下,cookie存储在浏览器内存中,当浏览器关闭,内存释放,则cookie被销毁
setMaxAge(int seconds):设置cookie存活时间
1.正数:将cookie写入浏览器所在的电脑硬盘,持久化存储,到时间自动删除
2.负数:默认值,cookie随着浏览器的关闭而销毁
3.零:删除对应的cookie
存储七天的例子
package com.project.JavaScript;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/res")
public class res extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//发送Cookie
//1.创建Cookie对象
Cookie cookie = new Cookie("username","666");
//设置cookie存活7天 60是秒
cookie.setMaxAge(60*60*27*7);
//2.发送Cookie,response
response.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
其实就一行代码
cookie.setMaxAge(60*60*27*7);
4.cookie存储中文
cookie不能直接存储中文
如果需要存储,则要进行转码:URL编码
三、Session
session是基于cookie的
服务端会话跟踪技术:将数据保存到服务端
JavaEE提供HttpSession接口,来实现一次会话的多次请求间数据共享功能
如果数据存储在cookie里面,每次访问带来带去,就会造成泄露的隐患,所以使用Sessoin比较好一点
1.Session钝化、活化
服务器在重启后,sesion中的数据是否还存在
钝化:在服务器正常关闭后,Tomacat会自动将sesion数据写入到硬盘中
活化:再次启动服务器后,从文件中加载数据到sesion中
2.Session基本使用
存储Session
package com.project.JavaScript;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/Session1")
public class Session1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//存储到session中
//1.获取session对象
HttpSession session = request.getSession();
//2.存储数据
session.setAttribute("username","KPL");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
获取Session
package com.project.JavaScript;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet("/Session2")
public class Session2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取数据,从session中
//1.获取session对象
HttpSession session = request.getSession();
//2.获取数据
Object username = session.getAttribute("username");
System.out.println(username);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
运行结果为
KPL
3.sesion销毁
默认情况下,无操作,30分钟自动销毁
更改为100分钟例子
在web.xml里面配置就好了
<session-config>
<session-timeout>100</session-timeout>
</session-config>
立即销毁(销毁sesion自己)
session.invalidate();
四Cookie和Sesion区别
区别:
存储位置:cookie是将数据存储在客户端,sesion将数据存储在服务端
安全性:cookie不安全,sesion安全
数据大小:cookie最大3KB,sesion无大小限制
存储时间:cookie可以长时间存储,sesion默认30分钟
服务器性能:cookie不占用服务器资源,sesion占用服务器资源