java中过滤器

Filter过滤器它的作用是:拦截请求,过滤响应

应用场景:

权限检查

日志操作

事务管理

web.xml

1.配置过滤器

2.指定过滤器的url-pattern规则

doFilter中如果没有调用继续请求的方法,就停止

如果继续访问,filterChain.doFilter(servletRequest,servletResponse)

在调用过滤器前,request对象已经被创建并封装

request.getRequestDispatcher("").forward(request,response);//请求转发不经过过滤器

<img src=""/>要走过滤器

Filter过滤器url-pattern

1.url-pattern:Filter的拦截路径,即浏览器在请求什么位置的资源时,过滤器会进行拦截过滤

2.精确匹配<url-pattern>/a.jsp</url-pattern>对应的请求地址 http://ip[域名]:port/工程路径/a.jsp会拦截

3.目录匹配<url-pattern>/a/*</url-pattern>对应的请求地址 http://ip[域名]:port/工程路径/a/xx,即web工程a目录下所有资源会拦截

4.后缀名匹配<url-pattern>*.jsp</url-pattern>后缀名可变,请求地址 http://ip[域名]:port/工程路径/xx.jsp,后缀名为.jsp请求会拦截

5.Filter过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在

Filter生命周期

java 复制代码
public class DemoFilter implements Filter {
	@Override
	//1.当web工程启动时,由tomcat来创建filter实例,只会创建一个,会执行构造器和init方法,只会调用一次
	//2.DemoFilter实例会常驻内存
	//3.在创建filter实例时,同时会创建FilterConfig对象,并通过init方法传入
	//4.通过FilterConfig对象,可以获取filter的相关配置信息
	public void init(FilterConfig filterConfig) throws ServletException {
	}
	@Override
	//1.当HTTP请求到TOMCAT
	//2.如果匹配到Filter的url-pattern
	//3.doFilter()方法就会被调用
	//4.在调用doFilter方法时,tomcat会同时创建ServletRequest和ServletResponse和FilterChain对象,并通过doFilter方法传入
	//5.如果后面的请求目标资源(jsp,servlet..)会使用到request和response,那么会继续传递
	public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain) throws IOException,ServletException {
	}
	@Override
	//停止web工程时,销毁Filter实例,会调用destroy()
	public void destroy(){
	}
}

FilterConfig

1.FilterConfig是Filter过滤器的配置类

2.Tomcat每次创建Filter的时候,也会创建一个FilterConfig对象,这里包含了Filter配置文件的配置信息

3.FilterConfig对象作用是获取filter过滤器的配置内容

java 复制代码
String filterName = filterConfig.getFilterName();
String ip = filterConfig.getInitParameter("ip");
ServletContext servletContext = filterConfig.getServletContext();
//获取该filter所有的配置参数名
Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();


//遍历枚举
while (initParameterNames.hasMoreElements()) {
	System.out.println(initParameterNames.nextElement());
}
java 复制代码
String remoteAddr = servletRequest.getRemoteAddr();
if(remoteAddr.contains(ip)) {
	System.out.println("封杀该网段");
	servletRequest.getRequestDispatcher("/login.jsp").
	forward(servletRequest,servletResponse);
	return;
}
filterChain.doFilter(servletRequest,servletResponse);

FilterChain过滤器链

xml 复制代码
<filter>
	<filter-name>AFilter</filter-name>
	<filter-class>com.xd.filter.AFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>AFilter</filter-name>
	<url-pattern>/admin/*</url-pattern>
<filter-mapping>

<filter>
	<filter-name>BFilter</filter-name>
	<filter-class>com.xd.filter.BFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>BFilter</filter-name>
	<url-pattern>/admin/*</url-pattern>
<filter-mapping>

FilterChain注意事项

1.多个filter和目标资源在一次http请求中,在同一个线程中

2.当一个请求url和filter的url-pattern匹配时,才会被执行,如果有多个匹配上,就会顺序执行,形成一个filter调用链

3.多个filter共同执行时,因为是一次http请求,使用同一个request对象

4.多个filter执行顺序,和web.xml配置顺序保持一致

5.chain.doFilter(req,resp)方法 将执行下一个过滤器的doFilter方法,如果后面没有过滤器,则执行目标资源。

6.执行顺序http请求->A过滤器dofilter()->A过滤器前置代码->A过滤器chain.doFilter()->B过滤器dofilter()->B过滤器前置代码->B过滤器chain.doFilter()->目标文件->B过滤器后置代码->A过滤器后置代码->返回给浏览器页面/数据

相关推荐
独自破碎E1 分钟前
Java是怎么实现跨平台的?
java·开发语言
To Be Clean Coder8 分钟前
【Spring源码】从源码倒看Spring用法(二)
java·后端·spring
xdpcxq102927 分钟前
风控场景下超高并发频次计算服务
java·服务器·网络
想用offer打牌30 分钟前
你真的懂Thread.currentThread().interrupt()吗?
java·后端·架构
橘色的狸花猫40 分钟前
简历与岗位要求相似度分析系统
java·nlp
独自破碎E1 小时前
Leetcode1438绝对值不超过限制的最长连续子数组
java·开发语言·算法
用户91743965391 小时前
Elasticsearch Percolate Query使用优化案例-从2000到500ms
java·大数据·elasticsearch
yaoxin5211231 小时前
279. Java Stream API - Stream 拼接的两种方式:concat() vs flatMap()
java·开发语言
坚持学习前端日记2 小时前
2025年的个人和学习年度总结以及未来期望
java·学习·程序人生·职场和发展·创业创新
Cosmoshhhyyy2 小时前
《Effective Java》解读第29条:优先考虑泛型
java·开发语言