会话控制 Cookie and Session
1. 会话控制技术概述
1.1 为什么要使用会话控制
因为HTTP协议连接是一个无状态连接
例如:
1. 服务器端数据更新,页面更换,如果浏览器不重新访问请求,是不可能获取到新
的内容,这就是一种【无状态的表现】
2. 浏览器每一次访问服务器,服务器是无法知道当前浏览器访问之前做过什么,不
管是浏览器,还是服务器都没有对数据进行保存
1.2 什么是状态管理
WEB Application 会话过程中,浏览器和服务器直接的一次响应和请求就是一次会话!!!这里需要管理和操作的就是在浏览器和服务器直接交互过程中,产生的状态信息,这里可以利用会话控制技术,保存一些浏览器和服务器交互的核心数据。
可以减少浏览器请求的次数,同时降低服务器处理业务逻辑的压力。并且可以将浏览器的请求和服务器的响应连接在一起。
1.3 核心操作技术
Cookie
客户端保存会话数据的方式
Session
浏览器保存会话数据的方式
2. Cookie技术
2.1 Cookie技术概述
Cookie是浏览器保存访问WEB Application时留存的会话数据。服务器会在浏览器访问指定的资源时,使用响应头发送一定的Cookie信息给浏览器保存,浏览器会存储对应的Cookie数据,并且在下一次访问对应的WEB Application自动带上对应的Cookie数据,访问资源。
1. Cookie数据时通过 Response 响应从WEB Application接受,
响应头中Set-Cookie
2. Cookie数据会随着 Request 请求从浏览器到对应的WEB Application
请求头中Cookie
3. 会根据Cookie限制的有效路径来选择对应的资源
4. Cookie数据在浏览器中保存,有一定的限制,
浏览器保存Cookie个数总数限制 300
单一站点限制Cookie个数 20
单一Cookie数据大小 4KB以内
单一Cookie是键值对形式,有mame 和 value,并且不支持中文
2.2 Cookie操作涉及到的方法
方法 |
功能呢 |
Cookie(String name, String value) |
服务器创建一个Cookie对象 |
setPath(String path) |
Cookie数据的有效路径 |
setMaxAge(int time) |
Cookie的有效时间 |
Cookie[] Request.getCookies(); |
获取当前请求头中所有的Cookie数据数组 |
Response.addCookie(Cookie cookie) |
发送Cookie数据到浏览器 |
2.3 创建Cookie
// 创建一个Cookie
Cookie cookie = new Cookie("code", "CodingMonkey");
// 设置Cookie的有效路径
cookie.setPath("/");
// 设置当前Cookie的有效时间
cookie.setMaxAge(10);
// 通过Response响应对象发送数据到浏览器
resp.addCookie(cookie);
2.4 服务器获取浏览器请求带有的Cookie数据
package com.qfedu.a_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;
/**
* 从浏览器获取对应的cookie数据
*
* @author MI 2020/4/1 11:00
*/
@WebServlet("/getCookie")
public class GetCookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 从HttpServletRequest对象中获取浏览器请求服务器带有的Cookie数据
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
// 获取Cookie的名字和Cookie的值
System.out.println(cookie.getName() + ":" + cookie.getValue());
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2.5 Cookie有效时间
Cookie cookie = new Cookie("code", "Java_Coder");
cookie.setPath("/");
/*
正数 大于0 有效时间,保存在浏览器本地磁盘中,时间Timeout自动销毁
负数 小于0 浏览器未关闭之前有效,内存存储Cookie
0 等于0 销毁Cookie
*/
cookie.setMaxAge(-1);
resp.addCookie(cookie);
2.6 Cookie路径问题
Cookie路径限制是为了约束当前Cookie在访问那些资源时带有对应的Cookie数据
1. 如果是默认情况下,没有自定义约束当前Cookie数据有效路径,默认是当前项目
2. 设置有效路径为setPath("/") 表示整个Tomcat服务器有效
3. /Day44/admin 指定Cookie有效路径,就是URL匹配路径,在一定范围内有效,可
以提高Cookie数据使用的安全性
3. Session 技术
3.1 Session技术概述
Session是保存在服务器端的一个会话控制对象,保留浏览器访问当前服务器提供的资源和必要信息。允许浏览器多次访问情况下,都可以获取到对应的Session信息。
浏览器使用Cookie保存Session的核心数据 Session ID号!!!
Cookie数据
个数限制,数据方式限制(String类型键值对),不支持中文,数据量限制4KB
Session数据
1. 服务器保存Session数据没有限制
2. Session存储数据的方式是键值对形式,键是String类型,但是值可以是任意类型。Session可以看做是一个Map双边队列 ==> HashMap<String, Object>
3. 中文没问题
4. 数据量也是没有问题,但是多多少少克制一下。
3.2 Session工作原理
Session会话技术是依托于Cookie
1. 浏览器第一次访问对应的服务器,服务器会根据当前访问的时间,其他参数生成一个Session ID号,这个ID号是不可以重复的!!!
2. 利用Cookie技术,服务器将Session ID号发送给浏览器保存
3. 浏览器第二次访问对应的服务器,会带有Session ID号的Cookie访问对应的资源,服务器可以根据Session ID 找到对应的Session,从Session获取对应的数据。
4. 浏览器如果关闭Cookie技术,Session使用时非常麻烦,需要利用URL重写技术
5. 浏览器本地保存Session ID的cookie JSESSIONID 名字固定
3.3 HttpSession涉及到的方法
方法 |
功能 |
Request.getSession(); |
然后存在对应当前请求的Session返回对应Session,如果没有创建一个新的Session |
Request.getSession(boolean); |
参数为true,获取对应请求的Session对象,如果没有创建一个新的Session。参数为false,只会获取对应当前请求的Session,没有返回null |
String getId(); |
获取当前Session ID号,ID不可以重复 |
long getLastAccessedTime() |
获取上一次的访问时间 |
setMaxInactiveInterval(int interval); |
设置当前Session有效时间,单位是秒数 |
long getMaxInactiveInterval(); |
获取当前Session有效时间 |
long getCreationTime() |
获取Session的创建时间 |
setAttribute(String name, Object value) |
设置Session中存储的数据,键值对形式,String类型的键,值为Object类型 |
Object getAttribute(String name) |
获取指定键值对应的Object数据 |
removeAttribute(String name) |
删除对应的键值对 |
invalidate() |
销毁Session对象 |
3.4 使用Session
/*
如果有Session ID信息,查询对应的Session对象,返回HttpSession对象
如果没有Session ID信息,或者说没有找到对应的Session对象,创建新的HttpSession
服务器会在浏览器端留有一个Cookie信息,JSESSIONID里面保存的Session ID
*/
HttpSession session = req.getSession();
System.out.println("Session ID : " + session.getId());
session.setMaxInactiveInterval(30);
##### 3.5 Session绑定数据,利用Session是一个域对象属性
3.6 Session对象销毁
销毁对应的Session对象
session.invalidate();
4. 使用Cookie和Session完成自动登录操作
image.png
5. 过滤器 Filter
5.1 什么是过滤器
Filter过滤器
WEB Application中有很多资源都是需要用户登录之后才可以进行访问查询,刚刚完成的自动登录操作中就有类似的内容,IndexServlet和ImgServlet都对用户是否登录做了验证。
该验证过程是重复的,是否可以将验证信息,或者说过滤条件是否可以访问放到一个统一的资源中?
WEB三大组件之后的Filter,过滤器!!!Filter过滤器可以根据条件,限制,过滤要求来对用户的访问进行过滤操作。
使用过滤器完成编码集处理,权限控制,敏感词汇过滤【代理】
5.2 第一个Filter过滤器
特征:
1. 过滤器随着服务器的启动直接加载,准备完毕
2. HTML ==> Filter ==> Server ==> Filter ==> HTML
package com.qfedu.e_filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/**
* 第一个Filter程序
*
* /* 表示过滤所有资源
*
* @author MI 2020/4/1 16:38
*/
@WebFilter("/*")
public class AFilter implements Filter {
public AFilter() {
System.out.println("AFilter Constructor Method");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("AFilter init Method");
}
/**
* 是否放行的核心方法
*
* @param request 请求
* @param response 响应
* @param chain 是否放行操作FilterChain,有且只有一个方法 doFilter
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("Before AFilter...");
// 放行
chain.doFilter(request, response);
System.out.println("After AFilter...");
}
@Override
public void destroy() {
System.out.println("销毁");
}
}
网友评论