[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 之间关联的技术内幕

三、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 运行报错
        
    
    
  2. 在 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