Filter #
- 过滤器,是JavaWeb三大组件之一,是一个驻留在服务端的Web组件,可以截取用户端和资源之间的请求和响应信息,并对信息进行过滤
- 过滤器可以把对web资源的请求和响应
拦截下来,做一些处理后再交给下一个过滤器或客户端。从而实现一些特殊的功能。 - 过滤器一般完成一些
通用操作,比如:自动登录、权限控制、统一编码格式设置、敏感字符过滤等。
工作流程 #
生命周期 #
- 当服务器启动的时候,Filter对象会被创建,并且调用
init()方法 - 当我们通过浏览器请求Servlet的时候,Servlet对象会被创建,并且调用
init()方法,然后调用过滤器的doFilter()方法对请求过滤,然后再调用servlet的service()方法,然后再调用过滤器的doFilter()方法对响应过滤 - 当我们多次访问Servlet的时候,只会重复的调用filter的
doFilter()方法和Servlet的service()方法 - 当我们正常的关闭服务器的时候,会先执行Servlet的
destroy()方法,然后再执行Filter的destroy()方法
过滤器的实现 #
1、实现javax.servlet.Filter接口 #
package top.ygang.filters;
import javax.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter {
@Override
public void init(FilterConfig arg0) throws ServletException {
// 初始化方法,接受一个 FilterConfig 的参数,该参数是对Filter的配置,在服务器启动时自动调用
// 一般不用实现该方法
}
@Override
public void destroy() {
// 服务器关闭时调用,释放Filter占用的资源
// 一般不用实现该方法
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
// 过滤方法,对 Resquest 与 Response 对象进行处理,之后交给其他Filter或服务器端
// 如果符合过滤规则则通过chain.doFilter(request,response);进行放行
}
}
2、配置过滤器拦截规则 #
url-pattern的配置(配置拦截路径) #
- 具体的资源路径:
/xxx/servletDemo1,/demo1.jsp
- 根据路径进行拦截:
/xxx/*/user/*,/goods/*
- 针对后缀名进行配置:
*.jsp - 拦截所有的配置:
/*
方式一:通过web.xml文件 #
<filter>
<!-- 配置过滤器名称,一般为Filter实现类类名 -->
<filter-name>MyFilter</filter-name>
<!-- 配置过滤器实现类全类名 -->
<filter-class>top.ygang.filters.MyFilter</filter-class>
</filter>
<!-- 指定过滤器规则 -->
<filter-mapping>
<!-- 规则所属的过滤器 -->
<filter-name>MyFilter</filter-name>
<!-- 过滤器拦截路径 -->
<filter-pattern>/*</filter-pattern>
</filter-mapping>
方式二:通过注解@WebFilter #
@WebFilter({"/login.jsp","/auth.jsp"})
配置多个过滤器(过滤器链) #
过滤相同资源时执行的先后顺序 #
- 配置文件:谁在配置文件的上面谁先执行
- 注解:根据类名的字符串的字典顺序(字母
a-z)进行排序由小到大
使用举例 #
过滤字符,防止中文乱码 #
如果是tomcat8之前的版本,该方法只可以解决post请求的乱码处理
@WebFilter("/*")
public class CharacterFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
chain.doFilter(request,response);
}
}