Filter是什么

什么是Filter,看名字就是过滤器的意思,主要是针对用户发起的请求进行拦截预处理,常见的Filter应用有检查当前请求是否登录,记录请求日志,设置上下文信息等等,当然Filter也可以对请求的响应做处理,Filter的设计是个典型的责任链模式

客户端发起http请求

web容器接受到请求后,调用拦截器链,依次调用各个Filter

每个Filter执行完自己的逻辑后,显式调用chain.doFilter,进行下个Filter的执行,最终调用到目标servlet

返回servlet数据到客户端

如何实现一个Filter

Filter的实现和之前Servlet类似,这里我们就只讲基于注解的方式来配置Filter

在上一篇的项目里,新建一个DemoFilter

实现Filter接口,可实现三个方法init,doFilter destroy

添加WebFilter注解,其中urlPatterns表示当前Filter需要拦截匹配的url , 这里我们配置/*表示拦截所有请求

@WebFilter(filterName = "demoFilter",urlPatterns = "/*")

public class DemoFilter implements Filter {

@Override

public void init(FilterConfig filterConfig) throws ServletException {

System.out.println("filter init");

}

@Override

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

System.out.println("do filter");

filterChain.doFilter(servletRequest,servletResponse);

}

@Override

public void destroy() {

System.out.println("filter destroy");

}

复制代码

}

应用在启动时会调用filter的init方法,需要特别注意的是,在每个filter的实现里需要显式调用chain.doFilter方法,否则会导致当前请求无法触达到最终的Servlet实现

每当发起一个HTTP请求,就会匹配filter的urlPattern,如果匹配上则进入filter的doFilter方法,多个filter的顺序调用需要显式的调用chain.doFilter方法

责任链模式

Filter主要是责任链模式的实现,模拟实现拦截器实现

抽象处理类

public abstract class Filter {

//顺序

protected Long order;

public Long getOrder() {

return order;

}

public void setOrder(Long order) {

this.order = order;

}

//核心处理方法

abstract boolean doFilter();

}

复制代码

实际处理类

public class AuthFilter extends Filter{

public AuthFilter(Long order) {

super.order=order;

}

@Override

boolean doFilter() {

System.out.println("AuthFilter");

return true;

}

}

public class LogFilter extends Filter{

public LogFilter(Long order) {

super.order=order;

}

@Override

boolean doFilter() {

System.out.println("LogFilter");

return true;

}

}

复制代码

责任链类

public class FilterChain {

List filterList = new LinkedList<>();

public void doFilter(){

List collect = filterList.stream().sorted(Comparator.comparing(Filter::getOrder)).collect(Collectors.toList());

for (Filter filter : collect) {

if(!filter.doFilter()){

break;

}

}

}

public boolean add(Filter filter){

return filterList.add(filter);

}

}

复制代码

测试链路

public class FilterTest {

public static void main(String[] args) {

AuthFilter authFilter = new AuthFilter(1L);

LogFilter logFilter = new LogFilter(2L);

FilterChain chain =new FilterChain();

chain.add(authFilter);

chain.add(logFilter);

chain.doFilter();

}

}

复制代码

JAVA爬虫三剑客,JAVAWEB三剑客之Filter相关推荐

  1. 什么是JavaWeb三剑客?

    JavaWeb三剑客: HTML(超文本标记语言 -- HyperText Markup Language) CSS(层叠样式表 -- Cascading Style Sheets) JS(JavaS ...

  2. DW-CHEN的Java点滴记录JavaWeb之HTTP协议/Servlet/Cookie/Session/JSP/EL/JSTL/Filter/Listener

    JavaEE规范 JavaEE(Java Enterprise Edition):Java企业版,早期叫J2EE(J2EE的版本从1.0到1.4结束):现在Java版本从JavaEE 5开始 Java ...

  3. JSOUP 教程—— Java爬虫,简易入门,秒杀htmlparser

    转载自 JSOUP 教程-- Java爬虫,简易入门,秒杀htmlparser 关于爬虫,之前一直用做第一个站的时候,记得那时候写的 爬虫  是爬sina 的数据,用的就是 htmlparser  可 ...

  4. 【代码审计-JAVA】基于javaweb框架开发的

    前言: 介绍: 博主:网络安全领域狂热爱好者(承诺在CSDN永久无偿分享文章). 殊荣:CSDN网络安全领域优质创作者,2022年双十一业务安全保卫战-某厂第一名,某厂特邀数字业务安全研究员,edus ...

  5. 基于Java爬虫的课堂考勤管理系统(毕业设计论文)

    开发环境和选用的架构: 本系统中采用的开发环境是Windows10+JDK8+Tomcat8+MySQL5.6 使用IDEA作为开发工具,GIT用作版本控制,Maven管理依赖 采用SSM+Sprin ...

  6. 手把手Java爬虫教学 - 2. 爬虫项目创建 需求说明

    上一篇博客我们简单的了解了一波爬虫,知道了什么是爬虫,爬虫的作用,下面我们就开始着手自己来创建一个爬虫.(项目源码估计你们得看最后的几个博客,因为我这个是一边写代码一边写博客的,所以说没有办法那么快提 ...

  7. Java爬虫框架之WebMagic的学习总结

    Java爬虫框架之WebMagic WebMagic 概述 特性 架构 四大组件 数据流转对象 控制爬虫运转的引擎Spider WebMagic的基本使用 添加WebMagic的核心与扩展依赖 爬虫实 ...

  8. [Java面试三]JavaWeb基础知识总结.

    [Java面试三]JavaWeb基础知识总结. 1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Int ...

  9. java 爬虫 异步_Java 爬虫遇上数据异步加载,试试这两种办法!

    这是 Java 爬虫系列博文的第三篇,在上一篇 Java 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题 ...

最新文章

  1. 3D Slicer实现纤维追踪(大脑纤维束成像)+核磁共振影像数据处理
  2. WPF 用户控件的使用
  3. 启动oracle的三过程
  4. PIC单片机入门_异步通讯模式详解
  5. [转]十五分钟介绍 Redis数据结构
  6. 嵌入式常见笔试题总结(5)
  7. iOS 移动端生成工具开发
  8. 票据图片复杂表格框识别(票据单元格切割)
  9. 代码雨代码源复制_p#39;y代码雨怎么做
  10. 音视频系列七 使用libyuv提高转换性能
  11. ajax.post传输数据,ajax POST方式数据传递
  12. mysql获取字符串长度函数(CHAR_LENGTH)
  13. vue-awsome-swiper稳定版本3.1.3及使用方法,API见swiper官网https://www.swiper.com.cn/api/index.html
  14. IntelliJ IDEA里面配置任何路径的时候路径里面的反斜杠分隔符变成了钱币符号
  15. 护网笔记(三)-Windows基础、常用服务和入侵排查
  16. python计算整数区间[m、n所有整数之和_Python:就区间正整数内所有素数之和
  17. 使用echarts扩展地图案例
  18. 微商城如何借势618微信营销?5分钟完成活动策划案
  19. 打了一台滴滴D1后,我开始思考今后还要买车吗?
  20. 微信小程序 仿朋友圈

热门文章

  1. css字压,CSS自定义字体的实现,前端实现字体压缩
  2. wlmedia播放器集成(1)— 播放器集成
  3. 新寻仙最新服务器,寻仙合服查询系统
  4. File.Create(zipFilePath)时对路径XX的访问被拒绝
  5. linux如何把用户加组内,在Linux中将用户添加到特定组的四种方法
  6. 走进C++11(三十七)原子操作之 std::atomic
  7. w3cschool教你一天入门AJAX
  8. Hybird-untag
  9. MySQL 实现累积求和的几种方法
  10. C#中的字段与属性的区别及属性的作用