Filter过滤器的使用
目录
什么是过滤器
使用过滤器
实现接口
配置拦截的url
在xml中进行配置
注解配置
过滤器的执行顺序
xml配置的执行顺序
注解配置的执行顺序
四种拦截方式
实现错误页面
什么是过滤器
Filter过滤器是一种部署在Web服务器上的组件,它能够对客户端发送到服务器的请求以及服务器返回给客户端的响应进行拦截和处理。通过Filter过滤器,开发者可以在请求到达Servlet之前或响应发送给客户端之前对它们进行各种操作。
当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,那么会继承执行用户请求的Servlet;如果Filter不“放行”,那么就不会执行用户请求的Servlet。
使用过滤器
与Servlet不同的是,过滤器在启动时就会创建过滤器对象,并执行init方法,而Servlet是在进行第一次请求时才创建对象。
使用过滤器的步骤为:
- 编写一个类实现javax.Servlet.Filter接口
- 重写拦截请求方法doFilter()
- 给过滤器进行配置,配置拦截的url
实现接口
实现接口时要注意:导入的包为javax.Servlet包。
实现方法:
public class AFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("AFilter执行");
}
/**
* 用户每请求一次,请求url被过滤器拦截一次,就会执行一次
* @param filterChain 过滤器链对象
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("执行doFilter方法");
}
@Override
public void destroy() {
System.out.println("AFilter即将销毁");
}
}
值得一提的是,在Filter接口中,init方法和destroy方法为默认方法,有方法体,这是jdk1.8的新特性,这样在实现接口时也能继承这两个方法。
配置拦截的url
实现接口后并不能直接使用,还需要对其拦截的url进行配置。配置url有两种方法,一种是在xml文件中配置,另外一种是注解配置。
注:不能两种方式同时配置
在xml中进行配置
<!-- 过滤器配置-->
<filter>
<filter-name>AFilter</filter-name>
<filter-class>com.fs.filter.AFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AFilter</filter-name>
<!-- 拦截的url,一般与通配符一起使用-->
<url-pattern>/aaa/*</url-pattern>
<url-pattern>/bbb/*</url-pattern>
<!-- 拦截指定名字的Servlet-->
<!-- <servlet-name>LoginServlet</servlet-name>-->
</filter-mapping>
注解配置
过滤器的执行顺序
xml配置的执行顺序
在XML配置的过滤器中,执行顺序是按照web.xml文件中<filter-mapping>元素的声明顺序来决定的。
注解配置的执行顺序
过滤器会按照其类名的字母顺序进行排序。这意味着类名字符串值较小的过滤器会先被执行。
四种拦截方式
我们来做个测试,写一个过滤器,指定过滤的资源为b.jsp,然后我们在浏览器中直接访问b.jsp,你会发现过滤器执行了!
但是,当我们在a.jsp中request.getRequestDispathcer(“/b.jsp”).forward(request,response)时,就不会再执行过滤器了!也就是说,默认情况下,只能直接访问目标资源才会执行过滤器,而forward执行目标资源,不会执行过滤器!
其实过滤器有四种拦截方式!分别是:REQUEST、FORWARD、INCLUDE、ERROR。
REQUEST:直接访问目标资源时执行过滤器。包括:在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是REQUEST; 默认值
FORWARD:转发访问执行过滤器。包括RequestDispatcher#forward()方法、jsp:forward标签都是转发访问;
INCLUDE:包含访问执行过滤器。包括RequestDispatcher#include()方法、jsp:include标签都是包含访问;
ERROR:当目标资源在web.xml中配置为<error-page>中时,并且真的出现了异常,转发到目标资源时,会执行过滤器。
实现错误页面
使用error拦截方式可以实现,当页面出错时,跳转到目标资源,首先要在xml文件中进行配置:
<!-- 配置错误页面-->
<error-page>
<!-- 异常类型-->
<!-- <exception-type></exception-type>-->
<!-- 错误状态码-->
<error-code>404</error-code>
<!-- 错误页面的路径-->
<location>/error.jsp</location>
</error-page>
编写了一个error.jsp,这样在出现404错误时会自动跳转到error.jsp界面。