JavaWeb之过滤器Filter

news2024/11/29 2:32:03

今天开发遇到了,简单记录一下!


简介:Filter是JavaWeb三大组件之一(Servlet程序、Listener监听器、Filter过滤器)

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

1、Filter中的三个方法

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

/**
 * @author 星悦糖
 * @createDate 2023/4/28 10:00
 */
public class FilterController 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 {

    }

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

    }
}

2、Filter的用法

2.1、用法一

  • 自定义一个过滤器实现Filter接口、添加@WebFilter注解,配置拦截路径;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * @author 星悦糖
 * @createDate 2023/4/28 10:00
 */
@WebFilter(urlPatterns = "/*")
@Slf4j
public class FilterController 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 {
        log.info("过滤器初始化");
    }

    /**
       * 这个方法完成实际的过滤操作,当客户请求访问与过滤器相关联的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 {
        log.info("执行过滤操作");
    }

    /**
       * filter创建后会保存在内存中,当web应用移除或者服务器停止时才销毁,该方法在Filter的生命周期中仅执行一次,在这个方法中,可以释放过滤器使用的资源
     * */
    @Override
    public void destroy() {
        log.info("web应用被移除或者服务器停止,过滤器终止执行,资源被释放");
    }
}
  • 在启动类上加上@ServletComponentScan注解
@SpringBootApplication
@ServletComponentScan
public class Application {

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

}
  • controller中和之前一样正常写即可;

2.2、用法二

  • 自定义一个过滤器实现Filter接口,在doFilter方法中控制filterChain.doFilter(servletRequest, servletResponse)调用;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.*;
import java.io.IOException;

/**
 * @author 星悦糖
 * @createDate 2023/4/28 10:00
 */
@Slf4j
public class FilterController 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 {
        log.info("过滤器初始化");
    }

    /**
       * 这个方法完成实际的过滤操作,当客户请求访问与过滤器相关联的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 {
        log.info("执行过滤操作");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    /**
       * filter创建后会保存在内存中,当web应用移除或者服务器停止时才销毁,该方法在Filter的生命周期中仅执行一次,在这个方法中,可以释放过滤器使用的资源
     * */
    @Override
    public void destroy() {
        log.info("web应用被移除或者服务器停止,过滤器终止执行,资源被释放");
    }
}
  • 在启动类上注册
@SpringBootApplication
public class Application {

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

  /**
   * 注册Filter
   * */
  @Bean
  public FilterRegistrationBean getFilterRegistrationBean(){
    FilterRegistrationBean bean = new FilterRegistrationBean(new FilterController());
    bean.addUrlPatterns("/*");
    return bean;
  }
}

2.3、方法三

  • 自定义一个过滤器实现Filter接口、添加@Component注解,配置拦截路径;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author 星悦糖
 * @createDate 2023/4/28 10:00
 */
@Component
@Slf4j
public class FilterController 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 {
        log.info("过滤器初始化");
    }

    /**
       * 这个方法完成实际的过滤操作,当客户请求访问与过滤器相关联的URL的时候,Servlet过滤器将先执行doFilter方法,FilterChain参数用于访问后续过滤器
       * @param request
       * @param response
       * @param filterChain
       * @throws IOException
       * @throws ServletException
     * */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        //请求参数打印
        String filterUrl = httpServletRequest.getRequestURI();
        log.info("uri: " + filterUrl);
        String url = "/student/user/access";  //controller中的请求路径 
        if(filterUrl.equals(url)){
            log.info("执行要拦截的操作");
            filterChain.doFilter(request, response);
        }else {
            filterChain.doFilter(request, response);
        }
    }

    /**
       * filter创建后会保存在内存中,当web应用移除或者服务器停止时才销毁,该方法在Filter的生命周期中仅执行一次,在这个方法中,可以释放过滤器使用的资源
     * */
    @Override
    public void destroy() {
        log.info("web应用被移除或者服务器停止,过滤器终止执行,资源被释放");
    }
}
  • controller中的代码示例
@RestController
@Slf4j
@RequestMapping("/student")
public class UserController {

    @PostMapping(value = "/user/access")
    public Result getUser(@RequestBody User user) {
       
        return Result.buildSuccess("获取人员信息");

    }
}

3、Filter解决前后端交互跨域问题

@Slf4j
public class FilterController 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 {
        log.info("过滤器初始化");
    }

    /**
       * 这个方法完成实际的过滤操作,当客户请求访问与过滤器相关联的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 {
        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);
    }

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/470638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人类 vs AI:玩梗大作战,看看谁是最后的赢家?

能解释人类玩梗的 AI 究竟能多大程度地理解人类的「梗」? 五一假期就在眼前,LigaAI 小编每天都在「调休好烦」和「快放假啦」两种情绪间反复横跳,还会忍不住思考「AI 能不能理解调休和放假的情绪差异?」(一些精神世界高…

xilinx block design address editor 计算

xilinx block design address editor 计算 1k 0x000 ~ 0x3ff 10bit 1m 00000 ~ FFFFF 20bit 每个pcie 配置空间有4k 【11:0】 PCIe 配置空间 (PCIe Configuration Space) PCIe Spec中定义:每个PCIe Function都有 4096 Byte 的配置空间(Configuration Space)。前256…

基于机器学习的纠错系统技术 - 智能文本纠错 API

引言 在过去的几十年里,文本纠错技术已经取得了巨大的进展,从最初的基于规则的纠错系统到现在的基于机器学习的纠错系统,技术的发展已经帮助人们解决了大量的文本纠错问题,随着机器学习技术的发展,文本纠错技术也发生…

WINCC 趋势判断

项目函数 //状态: //稳定 2 //稳定 //递增 -1 //无序 0 //波动 //递减 1 int ordered(double *Trend_data, int Trend_len) {int Trend_out 0,Order 0;if (Trend_len 1){return 2;}Trend_out (Trend_data[0] < Trend_data[1]) - (Trend_data[0] > Trend_da…

input 各类事件汇总触发时机触发顺序

今天梳理了一下input框的各类事件&#xff0c;简单介绍一下吧 目录 1.click 2.focus 3.blur 4.change 5.input 6.keydown 7.keyup 8.select 1.click 点击事件&#xff0c;简单易理解&#xff0c;点击触发&#xff0c;等下跟focus事件一起比较 2.focus 获取焦点事件…

新能源行业雨水除铊,污水中铊超标的解决方法

锂电行业的发展会带动相关产业的发展&#xff0c;例如锂电池原材料和生产设备的制造、电池回收和处理等&#xff0c;这些产业的发展可能也会带来铊排放问题。除了锂电池生产过程中可能存在的铊污染外&#xff0c;企业的生活污水也可能含有铊&#xff0c;因为铊是一种广泛存在于…

Java面试题总结 | Java面试题总结6-MYSQL模块(持续更新)

Mysql 文章目录 Mysql关系型数据库和非关系型数据库的区别什么是ORM?-**mybatis**如何评估一个索引创建的是否合理&#xff1f;Count函数执行效果上&#xff1a;执行效率上&#xff1a;count(主键)和count(列名) 数据库的三大范式Mysql中char和varchar的区别数据库设计或者功能…

【科普知识】电机的10种工作制说明:S1~S10

如今&#xff0c;在我们的生活中&#xff0c;电机几乎无处不在&#xff0c;从国防、工农、运输、临床器械、通讯到生活中的洗衣机、风扇、吸尘器、电动机器人等&#xff0c;都在应用着各式各样的电动机。 电机作为一种能够将电能转换成机械能的装置&#xff0c;是现代工业生产和…

Elisp之检测函数运行时,在它之前执行别的程序(六)

公众号&#xff1a;Android系统攻城狮 简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&am…

OpenGLES 实验室之2D篇 第三弹 の 直播白板

本文字数&#xff1a;4555字 预计阅读时间&#xff1a;12分钟 笔者之前发表的音视频文章&#xff0c;有图像的处理&#xff0c;音频的重采样等等&#xff0c;都属于入门级别。通过阅读它们&#xff0c;读者能对音视频有了了解。可在 Gitee 上面回顾。 2023 年&#xff0c;笔者将…

如何使用depcheck检查vue和react的依赖,以后不用把时间浪费在依赖问题上了

当我们在开发 JavaScript 项目时&#xff0c;会引入各种依赖库。但是有些依赖库可能只用到了部分功能&#xff0c;或者已经不再需要了&#xff0c;但是却一直被保留在项目中。 这些未使用的依赖库会占据项目的空间&#xff0c;增加项目的复杂度&#xff0c;影响项目的性能。为…

Elasticsearch --- 索引库、文档操作

一、索引库操作 索引库就类似数据库表&#xff0c;mapping映射就类似表的结构。 我们要向es中存储数据&#xff0c;必须先创建“库”和“表”。 1.1、mapping映射属性 mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括&#xff1a; type&#xff1a;字段数据…

【python】scikit-learn包:机器学习

环境配置&#xff1a;Scikit-learn包 只支持python语言 安装 WinR &#xff0c;输入指令&#xff1a;pip install -U scikit-learn 数据预处理 数据导入 借助pandas和numpy 进行数据导入与处理 字符串类label的数字化编码 机器学习的函数大部分只能对数字信息进行处理&…

轻量级任务看板做任务管理

利用看板管理工作和任务&#xff0c;可以让团队更高效&#xff0c;也可以一目了然的了解任务进度及问题 1、首先创建一个任务看板 使用看板工具轻量级项目模板创建一个任务看板。 任务看板内包含&#xff1a;列表和任务卡片&#xff0c;列表一般代表任务流程及状态&#xff…

(四)ArcMap基础——要素的选择

要素的选择 当要在已有的数据中选择部分要素时&#xff0c;ArcMap提供了三种方式&#xff1a;按属性选择、按位置选择及按图形选择。 目录 要素的选择一、按属性选择二、按位置选择三、按图形选择 一、按属性选择 通过设置 SQL 查询表达式&#xff0c;用来选择与选择条件匹配…

怎样解决高并发下的I/O瓶颈?

大家好&#xff0c;我是易安。 说起Java I/O&#xff0c;相信你一定不陌生。你可能使用I/O操作读写文件&#xff0c;也可能使用它实现Socket的信息传输…这些都是我们在系统中最常遇到的和I/O有关的操作。 我们都知道&#xff0c;I/O的速度要比内存速度慢&#xff0c;尤其是在现…

【致敬未来的攻城狮计划】— 连续打卡第十五天:FSP固件库外部中断处理编程(外部中断检测按键控制LED闪烁)

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

J - 在赌场玩

第一周任务 - Virtual Judge (vjudge.net) http://t.csdn.cn/rcwO7 第一周任务 - Virtual Judge (vjudge.net) 【题目描述】 然后所有玩家成对玩&#xff0c;每对玩家只玩一次。因此&#xff0c;例如&#xff0c;如果总共有四个玩家&#xff0c;则进行六场比赛&#xff1a;第…

真题详解(二分查找平均值)-软件设计(六十)

真题详解&#xff08;数据流图平衡&#xff09;-软件设计&#xff08;五十九)https://blog.csdn.net/ke1ying/article/details/130394959 全码&#xff1a;指关系模式所有属性都是这个关系模式的候选码。 RISC特点&#xff1a; 指令种类&#xff1a;少&#xff0c;精简 指令…

彻底弄懂Java的泛型1 - 泛型类

Java泛型是初级程序员向中高级程序员进阶的必经之路&#xff0c;他不是特别难&#xff0c;但是想全部搞懂和会用&#xff0c;还是不容易的。 本文从实战角度出发&#xff0c;讲解你在公司做开发&#xff0c;可能会用到泛型的一种场景。 泛型T的用法 引子 先来看一个简单的类…