过滤器
过滤器是对请求进行拦截,进行预处理或后处理,常见的过滤器使用场景有:
- 权限访问控制
- 请求字符集编码统一处理
- 内容敏感词过滤
- 响应信息压缩
简单使用
使用方式与Servlet一样,需要实现Filter
接口,与Servlet不同的是Filter的生命周期,Filter本身就是采用预加载的方式进行实例的创建
对同一个URL地址中,可有多个过滤器来形成过滤器链,执行顺序由web.xml
中注册的顺序决定
package com;
import javax.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter {
public MyFilter() {
System.out.println("MyFilter 实例被创建");
}
public void destroy() {
System.out.println("filter 销毁");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
System.out.println("filter 执行");
//若想使用HttpServletRequest和HttpServletResponse则需要向下转型
chain.doFilter(request, response); //调用该方法将请求响应向下一个过滤器或Servlet转发,否则会在此处断链
}
public void init(FilterConfig config) {
System.out.println("filter 初始化");
}
}
web.xml
中的配置
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/myservlet</url-pattern>
</filter-mapping>
通常用法
同样Filter也提供了注解的方式配置URL,但是对于过滤器链执行顺序就不确定了,经过测试顺序是按照过滤器的名字升序进行执行的
package com;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(filterName = "Filter1", urlPatterns = "/myservlet") //filterName会决定过滤器链的执行顺序
public class MyFilter implements Filter {
//destroy()和init()方法是Filter接口的默认方法,可以不实现
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
System.out.println("filter 执行");
chain.doFilter(request, response); //调用该方法将请求响应向下一个过滤器或Servlet转发,否则会在此处断链
}
}
过滤器的其他配置
默认情况下过滤器只对URL请求拦截一次,若想在请求转发中也拦截请求,则需要在web.xml
中配置dispatcher
标签定义拦截方式,过滤器的四种调度方式:
- REQUEST:URL请求方式,默认
- INCLUDE:JSP的include指令方式
- FORWARD:请求转发方式
- ERROR:错误请求方式
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/myservlet</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher> <!--此时请求也会拦截请求转发方式的请求-->
</filter-mapping>
Comments NOTHING