当前位置: 首页 > news >正文

java过滤器(Filter)

目录

1 过滤器简介

2 Filter详细介绍

3 Filter的用法

3.1 用法1

 3.2 用法2


1 过滤器简介

filter也称之为过滤器,它是javaWeb三大组件之一(Servlet程序、Listener监听器、Filter过滤器)

作用:既可以对请求进行拦截,也可以对响应进行处理。

常见场景:权限检查,日记操作、拦截请求、过滤操作、对请求字符设置编码。

2 Filter详细介绍

要想介绍filter,就必须介绍Filter中的三个方法。

    /**
     * web应用启动时,web服务器将创建Filter的实例对象,并调用init方法,读取web.xml的配置,完成对象的初始化功能,
     * 从而为后续的用户请求做好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次,开发人员通过init的参数,
     * 可或得代表当前filter配置信息的FilterConfig对象)
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    /**
     * 这个方法完成实际的过滤操作,当客户请求访问与过滤器相关联的URL的时候,Servlet过滤器将先执行doFilter方法,FilterChain参数用于访问后续过滤器
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    }

    /**
     * filter创建后会保存在内存中,当web应用移除或者服务器停止时才销毁,该方法在Filter的生命周期中仅执行一次,在这个方法中,可以释放过滤器使用的资源
     */
    @Override
    public void destroy() {

    }

3 Filter的用法

3.1 用法1

1)自定义一个过滤器实现Filter接口、配置@WebFilter注解,配置拦截路径(也可通过web.xml配置)

@WebFilter(urlPatterns = "/*")
public class MyFilterOne implements Filter {

    /**
     * web应用启动时,web服务器将创建Filter的实例对象,并调用init方法,读取web.xml的配置,完成对象的初始化功能,
     * 从而为后续的用户请求做好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次,开发人员通过init的参数,
     * 可或得代表当前filter配置信息的FilterConfig对象)
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    /**
     * 这个方法完成实际的过滤操作,当客户请求访问与过滤器相关联的URL的时候,Servlet过滤器将先执行doFilter方法,FilterChain参数用于访问后续过滤器
     * @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("我是过滤器,我进来了");
    }

    /**
     * filter创建后会保存在内存中,当web应用移除或者服务器停止时才销毁,该方法在Filter的生命周期中仅执行一次,在这个方法中,可以释放过滤器使用的资源
     */
    @Override
    public void destroy() {

    }
}

2)在启动类上加上@ServletComponentScan注解

@SpringBootApplication
@ServletComponentScan
public class SpringbootInterceptorApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootInterceptorApplication.class, args);
    }

}

3)controller:

@RestController
public class LoginController {

    @GetMapping("/test/filter")
    public String testFilter(){
        return "该请求被拦截了,但是在过滤器中已经放行了";
    }
}

直接浏览器访问:

 控制台输出:发现该请求已经被过滤去拦截

 3.2 用法2

1)自定义一个过滤器实现Filter接口、配置拦截路径(也可通过web.xml配置)

public class MyFilterOne implements Filter {

    /**
     * web应用启动时,web服务器将创建Filter的实例对象,并调用init方法,读取web.xml的配置,完成对象的初始化功能,
     * 从而为后续的用户请求做好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次,开发人员通过init的参数,
     * 可或得代表当前filter配置信息的FilterConfig对象)
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    /**
     * 这个方法完成实际的过滤操作,当客户请求访问与过滤器相关联的URL的时候,Servlet过滤器将先执行doFilter方法,FilterChain参数用于访问后续过滤器
     * @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("我是过滤器,我进来了");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    /**
     * filter创建后会保存在内存中,当web应用移除或者服务器停止时才销毁,该方法在Filter的生命周期中仅执行一次,在这个方法中,可以释放过滤器使用的资源
     */
    @Override
    public void destroy() {

    }
}

2)在启动类上注册

@SpringBootApplication
public class SpringbootInterceptorApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootInterceptorApplication.class, args);
    }


    /**
     * 注册Filter
     */
    @Bean
    public FilterRegistrationBean getFilterRegistrationBean(){
        FilterRegistrationBean bean = new FilterRegistrationBean(new MyFilterOne());
        //bean.addUrlPatterns(new String[]{"*.do","*.jsp"});
        bean.addUrlPatterns("/*");
        return bean;
    }
}

测试结果与3.1相同。

总结:

要想调用配置一个过滤器:

1)启动类上增加注解@ServletComponentScan

2)新建一个类使其实现Filter接口,并实现里面的三个方法

3)在新建类上加上@WebFilter()注解,配置需要拦截的规则

4)在doFilter方法中控制filterChain.doFilter(servletRequest, servletResponse)调用

同样,如果前后端交互有遇到跨域问题的,也可以通过Filter解决(亲测有效),如:

@WebFilter(filterName="CrossDomainFilter",urlPatterns="/*")
@Slf4j
public class CrossDomainFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        log.info(request.getRequestURL().toString());
        httpResponse.addHeader("Access-Control-Allow-Origin", "*");
        httpResponse.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        httpResponse.addHeader("Access-Control-Max-Age", "3600");

        httpResponse.addHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));
        httpResponse.addHeader("Access-Control-Allow-Credentials", "true");
        if (request.getMethod().equals(RequestMethod.OPTIONS.name())) {
            httpResponse.setStatus(HttpStatus.OK.value());
            return;
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

相关文章:

  • 概率 | 考研 —— 复习知识点及方法 大总结
  • 【OPC UA】C# 通过OpcUaHelper建立OPC客户端访问KEPServerEx6 OPC服务器数据
  • 大数据算法系列4:二叉树,红黑树和B树
  • 想知道图片转表格用什么软件?不妨试试这些软件
  • 作为一名测试人员,如何拾开发者牙慧,开启兼职赚钱之路
  • Web自动化测试(二)—— Selenium-API操作
  • 【面试分享】Java 面试题(Spring Boot / Spring Cloud)
  • 【计算机毕业设计选题】10套易过的精品毕设分享(源码+论文)
  • 推荐一个最好用的高性能、低内存、跨平台的图片处理库
  • Windows使用内存映射文件
  • 基于Matlab使用激光雷达检测分类跟踪车辆仿真(附源码)
  • 火狐浏览器 优化教程
  • 计算机的发展史,让你想到了什么?
  • 记一次SQL注入的收获
  • 大数据必学Java基础(八十):网络编程的深入了解
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 03Go 类型总结
  • CAP 一致性协议及应用解析
  • go语言学习初探(一)
  • MQ框架的比较
  • mysql 5.6 原生Online DDL解析
  • React中的“虫洞”——Context
  • 给初学者:JavaScript 中数组操作注意点
  • 记录:CentOS7.2配置LNMP环境记录
  • 讲清楚之javascript作用域
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 详解移动APP与web APP的区别
  • 项目实战-Api的解决方案
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 原生js练习题---第五课
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • ​2020 年大前端技术趋势解读
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #HarmonyOS:Web组件的使用
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • #职场发展#其他
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (1)虚拟机的安装与使用,linux系统安装
  • (11)iptables-仅开放指定ip访问指定端口
  • (11)MATLAB PCA+SVM 人脸识别
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (八十八)VFL语言初步 - 实现布局
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)大型网站架构演变和知识体系
  • (转载)利用webkit抓取动态网页和链接
  • **PHP二维数组遍历时同时赋值
  • .“空心村”成因分析及解决对策122344
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET Core 发展历程和版本迭代
  • .NET delegate 委托 、 Event 事件