Filter学习过滤器

Filter学习过滤器

  1. Filter 过滤器
    1.1 Filter概述
    生活中的过滤器
    净水器滤芯,空气滤芯,空调滤芯
    网络中的过滤器
    有些网站未登录状态下是无法访问的
    给你们我自己访问taobao订单页连接,但是你们无法访问我的订单。需要进行登录操作

过滤器的作用:
验证登录信息,处理字符问题,过滤跳转
生活中的过滤器
净水器滤芯,空气滤芯,空调滤芯
网络中的过滤器
有些网站未登录状态下是无法访问的
给你们我自己访问taobao订单页连接,但是你们无法访问我的订单。需要进行登录操作

过滤器的作用:
验证登录信息,处理字符问题,过滤跳转

1.2 Filter快速入门
步骤:
1. 自定义一个类,遵从 Filter接口 javax.servlet.Filter 接口,【千万别导错包】
2. 重写方法
3. 配置Filter
a. 注解方式
b. web.xml
步骤:
1. 自定义一个类,遵从 Filter接口 javax.servlet.Filter 接口,【千万别导错包】
2. 重写方法
3. 配置Filter
a. 注解方式
b. web.xml

package com.lexo.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**

  • 快速入门Filter

  • @WebFilter("/*") 访问所有的资源全部过滤
    /
    @WebFilter("/
    ")
    public class FilterDemo1 implements Filter {
    public FilterDemo1() {
    System.out.println(“Constructor called…”);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    System.out.println(“init called”);
    }

    /**

    • 过滤器的核心方法

    • @param servletRequest

    • @param servletResponse

    • @param filterChain

    • @throws IOException

    • @throws ServletException
      */
      @Override
      public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
      System.out.println(“doFilter called …”);

      // 放行
      filterChain.doFilter(servletRequest, servletResponse);
      }

    @Override
    public void destroy() {
    System.out.println(“Destroy called…”);
    }
    }
    package com.lexo.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**

  • 快速入门Filter

  • @WebFilter("/*") 访问所有的资源全部过滤
    /
    @WebFilter("/
    ")
    public class FilterDemo1 implements Filter {
    public FilterDemo1() {
    System.out.println(“Constructor called…”);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    System.out.println(“init called”);
    }

    /**

    • 过滤器的核心方法

    • @param servletRequest

    • @param servletResponse

    • @param filterChain

    • @throws IOException

    • @throws ServletException
      */
      @Override
      public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
      System.out.println(“doFilter called …”);

      // 放行
      filterChain.doFilter(servletRequest, servletResponse);
      }

    @Override
    public void destroy() {
    System.out.println(“Destroy called…”);
    }
    }

FilterDemo1 com.lexo.filter.FilterDemo1 FilterDemo1 /* FilterDemo1 com.lexo.filter.FilterDemo1 FilterDemo1 /*

1.3 Filter细节处理
1.3.1 Filter执行流程
浏览器访问服务器资源资源的路径,匹配到 Filter,会被Filter过滤
1. 执行 过滤器
2. 是否满足条件
满足: 放行,获取资源
不满足: 哪里来的哪里去,跳转到其他页面
3. 放行之后,执行资源,在回到过滤,最后给予用户响应
浏览器访问服务器资源资源的路径,匹配到 Filter,会被Filter过滤
1. 执行 过滤器
2. 是否满足条件
满足: 放行,获取资源
不满足: 哪里来的哪里去,跳转到其他页面
3. 放行之后,执行资源,在回到过滤,最后给予用户响应

1.3.2 Filter生命周期
类比 Servlet 生命周期,非常类似

  1. Filter类对象的构造方法 Constructor

  2. Filter类对象的init初始化

  3. doFilter过滤器核心方法执行
    doFilter(ServletRequest request, ServletResponse, FilterChain chain)

  4. 服务器正常关闭,执行的destroy方法
    类比 Servlet 生命周期,非常类似

  5. Filter类对象的构造方法 Constructor

  6. Filter类对象的init初始化

  7. doFilter过滤器核心方法执行
    doFilter(ServletRequest request, ServletResponse, FilterChain chain)

  8. 服务器正常关闭,执行的destroy方法

1.3.3 Filter过滤路径问题
设置过滤器的拦截路径
a. 具体拦截哪一个资源 /index.jsp
这里要求拦截的是 index.jsp
b. 拦截目录 /user/*
拦截 /user 路径下的所有资源
c. 拦截后缀 *.do .jsp
拦截指定的后缀名 .jsp 所有的jsp文件都会被拦截
d. 拦截所有资源 /

只要是当前Web Application内的资源都会被拦截
设置过滤器的拦截路径
a. 具体拦截哪一个资源 /index.jsp
这里要求拦截的是 index.jsp
b. 拦截目录 /user/

拦截 /user 路径下的所有资源
c. 拦截后缀 *.do *.jsp
拦截指定的后缀名 .jsp 所有的jsp文件都会被拦截
d. 拦截所有资源 /

只要是当前Web Application内的资源都会被拦截

1.3.4 拦截方式配置
a. 注解方式
@WebFilter中 使用DispatcherType,值是一个数组类型
REQUEST 默认值,用户通过浏览器直接请求资源
FORWARD 转发拦截,用户请求资源之后,被服务器资源转发给其他资源
ASYNC 异步拦截
ERROR 错误拦截
INCLUDE 包含资源拦截
b. web.xml
在filter-mapping 标签中
使用</dispatcher> 配置
配置内容同上
a. 注解方式
@WebFilter中 使用DispatcherType,值是一个数组类型
REQUEST 默认值,用户通过浏览器直接请求资源
FORWARD 转发拦截,用户请求资源之后,被服务器资源转发给其他资源
ASYNC 异步拦截
ERROR 错误拦截
INCLUDE 包含资源拦截
b. web.xml
在filter-mapping 标签中
使用</dispatcher> 配置
配置内容同上

1.3.5 过滤器链
过滤器两个 FilterDemo4 FilterDemo5
1. FilterDemo4
2. FilterDemo5
3. Add Servlet
4. FilterDemo5
5. FilterDemo4
WHY???

过滤的执行先后顺序。是非常随意的!!!按照字符串的比较方式,升序进行!!!
使用注解方式设置:
比较过滤器的类名字符串比较
AFilter BFilter

使用web.xml 配置

哪一个Filter对应的filter-mapping在前,先执行谁
过滤器两个 FilterDemo4 FilterDemo5
1. FilterDemo4
2. FilterDemo5
3. Add Servlet
4. FilterDemo5
5. FilterDemo4
WHY???

过滤的执行先后顺序。是非常随意的!!!按照字符串的比较方式,升序进行!!!
使用注解方式设置:
比较过滤器的类名字符串比较
AFilter BFilter

使用web.xml 配置

哪一个Filter对应的filter-mapping在前,先执行谁

  1. Filter使用案例
    2.1 登录验证
  2. 从用户访问服务器资源。浏览器自带Cookie中,获取Session信息
    用户已经登录: 可以访问资源
    用户没有登录: 跳转到登录界面

我们需要过滤的资源是登录之后才可以访问的资源
但是如果用户访问的资源刚刚好就是登录内容,该资源不能过滤,需要放行

  1. 从用户访问服务器资源。浏览器自带Cookie中,获取Session信息
    用户已经登录: 可以访问资源
    用户没有登录: 跳转到登录界面

我们需要过滤的资源是登录之后才可以访问的资源
但是如果用户访问的资源刚刚好就是登录内容,该资源不能过滤,需要放行

2.2 敏感词处理
弹幕过滤,贴吧回帖过滤,评论过滤…
你是笨蛋 --> 你是**

input:text name=“text”
String text = request.getParameter(“text”);
获取数据之后,处理数据
但是在HttpServletRequest对象中,没有setParameter方法

过滤器处理之后的数据依然是需要直接放行给后面的资源。
如果使用request.setAttribute方式告知后面的资源,会导致Servlet处理数据压力过大

设计模式!!!
通弹幕过滤,贴吧回帖过滤,评论过滤…
你是笨蛋 --> 你是**

input:text name=“text”
String text = request.getParameter(“text”);
获取数据之后,处理数据
但是在HttpServletRequest对象中,没有setParameter方法

过滤器处理之后的数据依然是需要直接放行给后面的资源。
如果使用request.setAttribute方式告知后面的资源,会导致Servlet处理数据压力过大

设计模式!!!
通过代理模式对getParameter方法,进行增强操作!!!
过代理模式对getParameter方法,进行增强操作!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值