更多python、PHP、JAVA教程请到友情连接: 菜鸟教程https://www.piaodoo.com

茂名一技http://www.enechn.com

ppt制作教程步骤 http://www.tpyjn.cn

兴化论坛http://www.yimoge.cn

电白论坛 http://www.fcdzs.com

表格制作excel教程 http://www.tsgmyy.cn

高州阳光论坛 http://www.tsgmyy.cn

过滤器是Servlet的规范,是基于函数回调的,需要实现javax.servlet.Filter接口,依赖于Tomcat等容器,一般用于过滤请求的URL。

1自定义过滤器

自定义filter的实现,本质上只有一种方式,就是实现Filter接口。但是在spring中我们有时候也会通过继承框架提供的XXXFilter,例如OncePerRequestFilter、 AbstractAuthenticationProcessingFilter(Spring Security使用的认证过滤器),当然,这些过滤器所实现的顶层接口还是Filter,只不过框架提供的过滤器都是有其特殊职能的,我们自己实现过滤器基本通过下面两种方法。

1.1实现Filter接口

public class MyFilterOne implements Filter {
?
? ? @Override
? ? public void destroy() {
? ? ? ? //服务停止时销毁;
? ? }
?
? ? @Override
? ? public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain)
? ? ? ? ? ? throws IOException, ServletException {
? ? ? ??
? ? ? ? System.out.println("this is MyFilter,url :" + request.getRequestURI());
? ? ? ? //1、进入过滤器,通常在这里根据requet做一些事情
? ? ? ? HttpServletRequest request = (HttpServletRequest) srequest;
? ? ? ? //2、放行,进入下一个过滤器,如果是最后一个过滤器,就执行Controller代码
? ? ? ? filterChain.doFilter(srequest, sresponse);
? ? ? ? //3、回到过滤器,通常在这里对response做一些处理
? ? ? ? HttpServletResponse response = (HttpServletResponse) srequest;
? ? }
?
? ? @Override
? ? public void init(FilterConfig arg0) throws ServletException {
? ? ? ? //服务启动时创建;
? ? }
?
}

1.2继承OncePerRequestFilter

下面的实现,并没有配置过滤路径,所有的请求都会进入到这个过滤器,但是它通过@Value获取配置的url列表,然后用这个列表去和进入过滤器的请求进行对比,如果匹配就做一些操作,如果不匹配直接放行。个人觉得还是配置过滤路径好。

@Component
@Order(-1)
public class MyFilterThree extends OncePerRequestFilter {
?
? ? private final List<Pattern> uriPatterns = new ArrayList<Pattern>();
?
? ? @Value("#{'${filtered.uris:^$}'.split(',')}")
? ? private List<String> filteredUris;
?
? ? @PostConstruct
? ? public void initialize() {
? ? ? ? for (String uri : this.filteredUris) {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? this.uriPatterns.add(Pattern.compile(uri));
? ? ? ? ? ? ? ? System.out.println(String.format("符合 '%s' 格式的URI,将进行过滤处理,否则放行.", uri));
?
? ? ? ? ? ? } catch (PatternSyntaxException patternSyntaxException) {
? ? ? ? ? ? ? ? System.out.println("Invalid regular expression pattern in filtered.uris: " + uri);
? ? ? ? ? ? }
? ? ? ? }
? ? }
?
? ? @Override
? ? protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
? ? ? ? System.out.println(httpServletRequest.getRequestURI());
? ? ? ? System.out.println("需要过滤的路径"+ Arrays.toString(uriPatterns.toArray()));
? ? ? ? System.out.println("进入过滤器了");
? ? ? ? filterChain.doFilter(httpServletRequest, httpServletResponse);//放行
? ? ? ? System.out.println("又回到过滤器了");
? ? }
?
? ? private boolean isMatchedUri(String uri) {
? ? ? ? if (StringUtils.isEmpty(uri)) {
? ? ? ? ? ? return false;
? ? ? ? } else {
? ? ? ? ? ? Iterator var2 = this.uriPatterns.iterator();
?
? ? ? ? ? ? Pattern pattern;
? ? ? ? ? ? do {
? ? ? ? ? ? ? ? if (!var2.hasNext()) {
? ? ? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? ? ? }
?
? ? ? ? ? ? ? ? pattern = (Pattern)var2.next();
? ? ? ? ? ? } while(!pattern.matcher(uri).find());
?
? ? ? ? ? ? return true;
? ? ? ? }
? ? }
}

1.3使过滤器生效配置

使用配置类

@Configuration
public class MyFilterConfiguration {
?
? ? @Bean
? ? public FilterRegistrationBean registerFilter() {
? ? ? ? System.out.println("MyFilterConfiguration");
? ? ? ? FilterRegistrationBean registration = new FilterRegistrationBean();
? ? ? ? registration.setFilter(new MyFilterOne());
? ? ? ? registration.addUrlPatterns("/public/*");//过滤的路径
? ? ? ? registration.addInitParameter("paramName", "paramValue");
? ? ? ? registration.setName("MyFilter");
? ? ? ? registration.setOrder(1);//在过滤链中的执行顺序
? ? ? ? return registration;
? ? }
}

@WebFilter和@ServletComponentScan(basePackages = "")

个人比较喜欢这个方式,代码量最小

第一步:在启动类上添加注解@ServletComponentScan(basePackages = "")

第二步:Filter类添加@WebFilter注解,配置FilterRegistrationBean的属性@WebFilter基本都有

@WebFilter(urlPatterns = "/selfAnnotation/*")
@Order(-2)
public class MyFilterFive extends OncePerRequestFilter {
?
? ? @Override
? ? protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
?
? ? ? ? System.out.println("进入5号过滤器了");
? ? }
}

2 Filter生命周期

init():在构造器被调用后,紧接着被调用。作用:用来初始化Filter。

doFilter():每一次拦截请求时都会调用。

destroy():方法在项目停止时调用,用来在对象被销毁前做一些收尾工作。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持菜鸟教程www.piaodoo.com。

springboot自定义过滤器的方法相关推荐

  1. springboot 自定义过滤器

    springboot 自定义过滤器 Filter 过滤器主要是用来过滤用户请求的,它允许我们对用户请求进行前置处理和后置处理,比如实现 URL 级别的权限控制.过滤非法请求等等.Filter 过滤器是 ...

  2. SpringBoot自定义过滤器实现高频IP限制访问

    代码走查的时候走查老师提出建议对高频ip做限制,防止不法ip攻击,去网上看了很多方法,最多的就是自定义注解,然后定义一个注解的实现类利用aop去验证该限制接口的请求ip是否符合,但是缺点就是我们不可能 ...

  3. springboot过滤字段_SpringBoot自定义过滤器的两种方式及过滤器执行顺序

    第一种 @WebFilter + @ServletComponentScan 注解 1.首先自定义过滤器 如下自定义过滤器 ReqResFilter必须实现  javax.servlet.Filter ...

  4. springboot项目中使用shiro 自定义过滤器和token的方式___shiro使用token登录流程

    springboot项目中使用shiro 自定义过滤器和token的方式 实现步骤主要是以下几步: 1. 在项目中导入maven依赖 <dependency><groupId> ...

  5. 过滤器获取service方法返回慢_Gateway:自定义过滤器

    自定义局部过滤器 需求:在application.yml中对某个路由配置过滤器,该过滤器可以在控制台输出配置文件中指定名称的请求参数的值. 在gateway-server模块中编写过滤器工厂类MyPa ...

  6. 关于将struts2框架下,使自定义过滤器对部分的action(一个action或多个action)请求忽略的方法

    关于将struts2框架下,使自定义过滤器对部分的action请求忽略的方法 首先需要了解一个方法 request.getServletPath() 他将返回一个当前请求的路径的醉详细名称 例如对路径 ...

  7. springboot编写自定义过滤器

    springboot编写自定义过滤器 首先引入依赖,其次编写过滤器 @Configuration public class FilterRegisterConfig {@Beanpublic Filt ...

  8. 09_Filter过滤器(访问所有资源前,首先执行自定义过滤器类的doFilter方法)_Listener监听器(监听域对象的改变)

    Filter 什么是Web过滤器? 如何使用Filter过滤器? 自定义Filter类的生命周期 过滤器可以拦截哪些资源路径? 拦截方式配置:资源被访问的方式 过滤器链的默认执行顺序是什么? 如何配置 ...

  9. SpringBoot自定义Filter

    SpringBoot自定义Filter SpringBoot自动添加了OrderedCharacterEncodingFilter和HiddenHttpMethodFilter,当然我们可以自定 义F ...

  10. SpringBoot 自定义实现一个启动器starter 教程。

    说明:springboot 官方给我们提供了很多启动器如:elasticsearch,aop,redis...等等 但是实际开发中,可能不同公司的业务不同需要定制化一个通用的专属的启动器来满足公司内部 ...

最新文章

  1. 2416开发板上网卡芯片lan9220的时序配置问题
  2. python猜拳游戏三局两胜制_猜拳游戏三局两胜------java实现代码
  3. 怎么用python爬取整个网站_5分钟学会Python爬取整个网站
  4. 十年,我的计算机生涯
  5. Qt for Android调用原生接口打开相机拍照并存储照片
  6. overload override
  7. 华尔街英语学习软件_华尔街英语核心课程功能升级 让学员学习之旅更高效
  8. js使用hover事件做一个“个人中心”的浮动层
  9. bower overrides 配置
  10. git ssh配置文件 服务器_git登录ssh服务器
  11. windows之2012缺少api-ms-win-crt**.dll
  12. 计算机的时代背景,学生计算机论文,关于新时代背景下的中专计算机教学相关参考文献资料-免费论文范文...
  13. centos6.5里用yum简单安装配置lamp
  14. awk , 统计secure.log中 每个破解你密码的ip的出现次数|access.log 中 每个ip地址出现的次数...
  15. 量化投资03---小市值轮动因子---准备工作01
  16. 技巧分享篇---如何从GitHub上下载某个项目中单个文件的方法
  17. 笔记本外接显示器教程级后续使用技巧
  18. mysql是一个大型数据库_MySQL是一个大型关系型数据库管理系统(RDBMS)。
  19. 大小写字母表(大小写字母表)
  20. PDF分割与合并(充分利用Spire的bug实现操作PDF)

热门文章

  1. win7由于无法确定计算机,nvme固态硬盘安装win7教程((解决硬盘无法识别)
  2. 开源多云技术平台——Choerodon猪齿鱼发布0.22版本
  3. java 刽子手游戏_Java刽子手游戏重绘()无法正常工作
  4. fingerprint mismatch错误原因分析
  5. 解决Outlook搜索功能的搜索结果不完整问题
  6. Mac谷歌浏览器添加JSONView的插件以提高开发的效率
  7. 冰点还原忘记密码怎样删除?
  8. “繁盛计划”,纾困中国餐饮难题背后的美团式解法
  9. 论文模型图全攻略——模型图就该有模型图的样子!
  10. wps如何只让他显示3级标题_wps怎么把标题显示出来