JAVA爬虫三剑客,JAVAWEB三剑客之Filter
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相关推荐
- 什么是JavaWeb三剑客?
JavaWeb三剑客: HTML(超文本标记语言 -- HyperText Markup Language) CSS(层叠样式表 -- Cascading Style Sheets) JS(JavaS ...
- 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 ...
- JSOUP 教程—— Java爬虫,简易入门,秒杀htmlparser
转载自 JSOUP 教程-- Java爬虫,简易入门,秒杀htmlparser 关于爬虫,之前一直用做第一个站的时候,记得那时候写的 爬虫 是爬sina 的数据,用的就是 htmlparser 可 ...
- 【代码审计-JAVA】基于javaweb框架开发的
前言: 介绍: 博主:网络安全领域狂热爱好者(承诺在CSDN永久无偿分享文章). 殊荣:CSDN网络安全领域优质创作者,2022年双十一业务安全保卫战-某厂第一名,某厂特邀数字业务安全研究员,edus ...
- 基于Java爬虫的课堂考勤管理系统(毕业设计论文)
开发环境和选用的架构: 本系统中采用的开发环境是Windows10+JDK8+Tomcat8+MySQL5.6 使用IDEA作为开发工具,GIT用作版本控制,Maven管理依赖 采用SSM+Sprin ...
- 手把手Java爬虫教学 - 2. 爬虫项目创建 需求说明
上一篇博客我们简单的了解了一波爬虫,知道了什么是爬虫,爬虫的作用,下面我们就开始着手自己来创建一个爬虫.(项目源码估计你们得看最后的几个博客,因为我这个是一边写代码一边写博客的,所以说没有办法那么快提 ...
- Java爬虫框架之WebMagic的学习总结
Java爬虫框架之WebMagic WebMagic 概述 特性 架构 四大组件 数据流转对象 控制爬虫运转的引擎Spider WebMagic的基本使用 添加WebMagic的核心与扩展依赖 爬虫实 ...
- [Java面试三]JavaWeb基础知识总结.
[Java面试三]JavaWeb基础知识总结. 1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Int ...
- java 爬虫 异步_Java 爬虫遇上数据异步加载,试试这两种办法!
这是 Java 爬虫系列博文的第三篇,在上一篇 Java 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题 ...
最新文章
- 3D Slicer实现纤维追踪(大脑纤维束成像)+核磁共振影像数据处理
- WPF 用户控件的使用
- 启动oracle的三过程
- PIC单片机入门_异步通讯模式详解
- [转]十五分钟介绍 Redis数据结构
- 嵌入式常见笔试题总结(5)
- iOS 移动端生成工具开发
- 票据图片复杂表格框识别(票据单元格切割)
- 代码雨代码源复制_p#39;y代码雨怎么做
- 音视频系列七 使用libyuv提高转换性能
- ajax.post传输数据,ajax POST方式数据传递
- mysql获取字符串长度函数(CHAR_LENGTH)
- vue-awsome-swiper稳定版本3.1.3及使用方法,API见swiper官网https://www.swiper.com.cn/api/index.html
- IntelliJ IDEA里面配置任何路径的时候路径里面的反斜杠分隔符变成了钱币符号
- 护网笔记(三)-Windows基础、常用服务和入侵排查
- python计算整数区间[m、n所有整数之和_Python:就区间正整数内所有素数之和
- 使用echarts扩展地图案例
- 微商城如何借势618微信营销?5分钟完成活动策划案
- 打了一台滴滴D1后,我开始思考今后还要买车吗?
- 微信小程序 仿朋友圈
热门文章
- css字压,CSS自定义字体的实现,前端实现字体压缩
- wlmedia播放器集成(1)— 播放器集成
- 新寻仙最新服务器,寻仙合服查询系统
- File.Create(zipFilePath)时对路径XX的访问被拒绝
- linux如何把用户加组内,在Linux中将用户添加到特定组的四种方法
- 走进C++11(三十七)原子操作之 std::atomic
- w3cschool教你一天入门AJAX
- Hybird-untag
- MySQL 实现累积求和的几种方法
- C#中的字段与属性的区别及属性的作用