[JavaWeb]CookieSession 和 Filter 过滤器

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaWeb]CookieSession 和 Filter 过滤器相关的知识,希望对你有一定的参考价值。

一、Cookie

1. Cookie 的定义、创建和获取

  1. Cookie 是服务器通知客户端保存键值对的一种技术,客户端有了 Cookie 后,每次请求都发送给服务器,每个 Cookie 的大小不能超过 4kb
  2. Cookie 对象的创建
// 1. 解决浏览器相应中文乱码问题 
resp.setContentType("text/html; charset=UTF-8");
// 2. 创建 Cookie 对象
Cookie name = new Cookie("name", "Spring-_-Bear");
// 3. 通知客户端保存 Cookie 对象
resp.addCookie(name);

服务器通知客户端保存 Cookie 对象时通过设置响应头 Set-Cookie 从而让客户端保存 Cookie 对象信息

  1. 服务端获取客户端的 Cookie 对象,在客户端请求头中存有 Cookie 对象,请求时会一并发送给服务器
Cookie[] cookies = req.getCookies();

2. Cookie 值的修改

  1. 创建与原 Cookie 相同的键的新 Cookie 对象,同时赋予新 Cookie 对象新的 Value 值,以替换方式达到修改 cookie 的目的
  2. 先查找到需要修改的 Cookie 对象,调用其 setValue() 方法赋予新的值
  3. 对于 Version 0 Cookie,值不应该包含空格、方括号、圆括号、等号、逗号、双引号、斜杠、问号、at 符号、冒号和分号、不能包含中文,当需要包含以上内容时,需先使用 BASE64 编码

3. Cookie 的存活设置

  1. Cookie 的生命控制是指 Cookie 的生命周期,即什么时候被销毁 cookie.setMaxAge(int)
  2. 正数:表示在指定的秒数后销毁
  3. 负数:表示关闭浏览器的同时销毁 (默认行为,默认值是 -1)、Session 级别
  4. 零:立刻销毁

4. Cookie 的 path 属性

  1. Cookie 的 path 属性可以有效过滤哪些 cookie 发送给服务器,哪些 cookie 不发以及 Cookie 发送的地址,path 属性是通过请求的地址来进行有效过滤的
  2. 设置 cookie 的 path 属性 cookie.setPath(req.getContextPath() + "/abc"); // /工程路径/abc

5. Cookie 练习之免用户名登录

UserServlet login() 方法中的实现

if ("bear".equals(username) && "bear".equals(password)) 
    System.out.println("登录成功");
    Cookie cookie = new Cookie("username", username);
    // cookie 对象一周内有效
    cookie.setMaxAge(60 * 60 * 24 * 7);
    resp.addCookie(cookie);
 else 
    System.out.println("登录失败");

二、Session

1. Session 的定义、创建和获取

  1. Session 是一个接口(HttpSession),是浏览器与服务器建立的会话,用来维护一个客户端和服务器之间关联的一种技术,每个客户端都有自己的一个 Session 会话。在 Session 会话中,经常用来保存用户登录之后的信息
  2. Cookie 和 Seesion 的区别:Cookie 保存在客户端,而 Session 保存在服务器
  3. req.getSession() 第一次调用是创建 Session 会话,之后调用都是获取第一次创建好的 Session 会话对象,可以使用 session.isNew() 方法判断对应的 session 对象是否是刚刚创建好的
  4. session.getId() 可以获取 Session 会话的唯一 id

2. Seesion 的超时控制

int maxInactiveInterval = session.getMaxInactiveInterval(); 可以获取 Session 对象的默认超时控制,默认时长为 1800s,因为在 tomcat 服务器的配置文件 web.xml 中进行了默认时长配置,配置了 Tomcat 服务器下的所有 Session 超时配置默认时长均为 30 分钟

<session-config>
	<session-timout>30</session-timeout>
</session-config>
  1. 可以在自己的 web 工程中的 web.xml 中写入以上相同配置,配置此工程中的所有 Session 会话的默认超时时长
  2. 若只想修改特定的 Session 会话的超时时长,可使用 session.setMaxInactiveInterval(60 * 60 * 24 * 7);方法进行单独设置,单位为秒
  3. Session 超时是指客户端两次请求的最大间隔时长,未达到最大间隔时长再次请求,则超时时间重置为最大间隔时长
  4. 使当前 Session 会话马上超时 session.invalidate();
  5. Session 会话在浏览器关闭的同时销毁,Session 底层实现基于 Cookie 技术

3. session 钝化与活化

  1. 当服务器正常关闭(浏览器未关闭)时,还存活着的 session (在设置时间内没有销毁) 会随着服务器的关闭被以文件(“SESSIONS.ser”)的形式存储在 tomcat work 目录下,这个过程叫做 Session 的钝化
  2. 当服务器再次正常开启(浏览器仍然没有关闭)时,服务器会找到之前的“SESSIONS.ser” 文件,从中恢复之前保存起来的 Session 对象,这个过程叫做 Session的活化

4. 浏览器和 Session 之间关联的技术内幕

三、Filter

1. Filter 的定义

  1. Filter 过滤器是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
  2. Filter 过滤器它是 JavaEE 的规范,也就是接口;它的主要作用是拦截请求、过滤响应。拦截请求常见的应用场景有权限检查、日志操作、事务管理等等。

2. Filter 的使用示例

  1. 编写类实现 javax.servlet.Filter 接口
/**
 * @author Spring-_-Bear
 * @datetime 2022/3/5 8:36
 */
public class AdminFilter implements Filter 
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException 
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpSession session = req.getSession();
        Object user = session.getAttribute("user");

        if (user == null) 
            // 未登录,跳转到登录页面
            req.getRequestDispatcher("/index.jsp").forward(servletRequest, servletResponse);
            return;
         else 
            // 过滤检查通过,正常访问请求的资源
            filterChain.doFilter(servletRequest, servletResponse);
        
    

    @Override
    public void init(FilterConfig filterConfig) throws ServletException 
        // 一定要删除此方法中调用父类方法的语句,否则 Tomcat 运行报错
    

    @Override
    public void destroy() 
        // 一定要删除此方法中调用父类方法的语句,否则 Tomcat 运行报错
    

  1. 在 web.xml 中配置 Filter 拦截路径
<!-- 配置一个Filter 过滤器 -->
<filter>
    <!-- 类别名 -->
    <filter-name>AdminFilter</filter-name>
    <!-- 全类名 -->
    <filter-class>com.bear.filter.AdminFilter</filter-class>
</filter>
<!-- 配置 Filter 过滤器的拦截路径 -->
<filter-mapping>
    <!--  表示当前的拦截路径给哪个 filter 使用 -->
    <filter-name>AdminFilter</filter-name>
    <!-- 配置拦截的资源路径
        / 表示 http://localhost:8080/工程名/ 映射到 IDEA 的 web 目录 -->
    <url-pattern>/admin/*</url-pattern>
</filter-mapping>

3. Filter 的生命周期

  1. Filter 生命周期中的重要方法:构造器、init 初始化方法、doFilter 过滤方法、destroy 销毁方法
  2. 构造器、init 在 web 工程启动的时候执行;doFilter 方法每次拦截到请求就会执行;destroy 方法在 web 工程停止的时候执行

4. FilterConfig 类

FilterConfig 类是 Filter 类的配置文件类,Tomcat 每次创建 Filter 的时候会同时创建一个 FilterConfig 类,此类中包含了 Filter 配置文件的配置信息,主要有以下作用:

  1. 获取 Filter 的名称 filter-name filterConfig.getFilterName()
  2. 获取在 web.xml 中配置的 init-param 初始化参数 filterConfig.getInitParameter("username");
  3. 获取 ServletContext 对象 filterConfig.getServletContext();

5. FilterChain 多个过滤器执行的细节

  1. FilterChain 过滤器链的作用是:如果有下一个 Filter 则执行,没有下一个 Filter 则执行请求的目标资源
  2. 在多个 Filter 过滤器执行的时候,它们执行优先顺序是由它们在 web.xml 中从上到下配置的顺序决定,跟类名没有关系
  3. 所有 Filter 和目标资源默认都执行在同一线程中
  4. 以上多个 Filter 共同执行的时候使用同一个 Request 对象,属于同一次请求
  5. Filter 过滤器只关心请求的地址是否符合拦截条件,不关心请求的资源是否存在

6. Filter 拦截路径的三种配置方式

精确匹配、目录匹配、后缀名匹配

<!-- 拦截地址必须以 .后缀名 结尾才会被拦截,配置文件不能以 / 打头  -->
<url-pattern>*.html</url-pattern>

以上是关于[JavaWeb]CookieSession 和 Filter 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

[JavaWeb]CookieSession 和 Filter 过滤器

Connect/Express 中的“session”和“cookieSession”中间件有啥区别?

CookieSession和Token

CookieSession和Cache

CookieSession

Cookiesession和localStorage以及sessionStorage