Filter过滤器
Posted 名字真的很急用
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Filter过滤器相关的知识,希望对你有一定的参考价值。
-
1.Filter的介绍
Filter是一个实现了javax.servlet.Filter接口的java类,也就是说如果想要实现这个类,必须实现Filter这个接口。
Filter的作用就是实现对请求的资源(HTML,CSS,js,图片,音频,视频,jsp,servlet)过滤的功能,也就是说客户在访问资源之前,请求先会到达Filter,只有Filter放行之后,才能访问对应的资源。
例如:大楼进出口的保安大叔,在你进入大楼之前得先让保安大叔进行测温,温度正常才能进入大楼。
过滤器的应用场景: -
登录权限的校验
-
过滤敏感字符
-
解决网站的乱码
-
2.Filter的初体验
package 过滤器;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class myFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//解除过滤
filterChain.doFilter(servletRequest, servletResponse);
}
System.out.println("1111111111");
}
@Override
public void destroy() {
}
}
实现过滤器有二种方式:
- 基于注解的方法
import javax.servlet.annotation.WebFilter;
@WebFilter("")
- 基于xml文件的配置方式
<filter>
<filter-name>myFilter</filter-name>
<filter-class>过滤器.myFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/success.jsp</url-pattern>
</filter-mapping>
- 3.Filter的生命周期
Filter的生命周期就是关注Filter对象什么时候被服务器创建和什么时候被服务器销毁
Filter在服务器启动的时候被创建,创建Filter对象的时候会执行
public void init(FilterConfig filterConfig) throws ServletException
该方法通常会用于执行一些耗时操作的场景,例如从配置文件中读取数据,该方法只会执行一次
Filter在服务器关闭的时候被销毁,销毁的Filter对象的时候会执行 public void destroy()
方法,该方法用于序列化保存备份操作,该方法只会执行一次。
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
该方法用于对目标拦截路径操作的方法,该方法拦截一次就会执行一次,可以执行多次。
- 4.Filter的三种拦截路径
<filter>
<filter-name>Filters</filter-name>
<filter-class>拦截的多种方式.Filters</filter-class>
</filter>
<filter-mapping>
<filter-name>Filters</filter-name>
<url-pattern>/*</url-pattern>
<url-pattern>*.html</url-pattern>
<url-pattern>*.jpg</url-pattern>
</filter-mapping>
1.可以精准匹配拦截
<url-pattern>/login</url-pattern>
2.模糊匹配拦截,/*拦截所有的资源路径
<url-pattern>/*</url-pattern>
3.扩展名拦截
<url-pattern>*.html</url-pattern>
<url-pattern>*.jpg</url-pattern>
- 5.Filter常用的二种拦截方式
在web.xml文件中,一个元素用于配置一个Filter所负责拦截的资源。元素中有一个特殊的子元素该元素用于指定过滤器所拦截的资源被servlet容器调用的方式,常用的元素值如下:
1.REQUEST
当用户直接访问页面时,web容器会调用过滤器,如果目标资源是通过RequsetDispatcher的include()或forward()方法访问时,那么该过滤器将不会被调用。
2.FORWARD
如果目标资源是通过RequsetDispatcher的forward()方法访问时,那么该过滤器将会被调用,除此之外,该过滤器不会被调用。
基于web.xml配置的方式
<filter>
<filter-name>myFilter</filter-name>
<filter-class>过滤器.myFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/success.jsp</url-pattern>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
基于注解的方法
@WebFilter(value = "/login",dispatcherTypes = {DispatcherType.FORWARD})
- 6.Filter链
过滤器链就是一系列的过滤器(多个)。
过滤器链的作用就是一个请求可能被多个过滤器过滤,只有当所有的过滤器都放行的时候,客户端的请求才能到达目标资源,如有有一个过滤器没有放行,那么请求就无法到达后续的过滤器以及目标资源。
过滤器链的执行顺序。
因为过滤器既可以通过注解的方式和xml配置的方式来实现,
1.当过滤器全部采用注解的方式配置时,执行顺序就是通过过滤器名的顺序(字典顺序)就是按照过滤器名的开头字母顺序A-Z,0-9
2.如果按照xml的配置方式,则按照过滤器配置的前后顺序来执行。
以上是关于Filter过滤器的主要内容,如果未能解决你的问题,请参考以下文章