版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/75804651
简介
要实现过滤器,必须实现Filter接口,并再web.xml或者注解中定义过滤器。过滤器有三个主要方法:
- init(FilterConfig config) 获得初始化参数,用法与servlet相同,需要配置初始化参数
- doFilter(ServltRequest request,ServletResponse response,FilterChain chain) 执行过滤流程
- destory()过滤器关闭时执行
web.xml 配置过滤器
与Servlet的配置基本类似,除了url-pattern外,还可以通过servlet指定
<filter>
<filter-name>FirstFilter</filter-name>
<filter-class>filter.FirstFilter</filter-class>
<init-param>
<param-name>name</param-name>
<param-value>tom</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
通过servlet-name指定servlet
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<servlet-name>dispatcher.Dispatch</servlet-name>
</filter-mapping>
web3.0中使用注解配置过滤器
@WebFilter(
filterName="WrapperFilter",
urlPatterns={"/*"},
servletNames={},
initParams={
@WebInitParam(name="name",value="tom"),
@WebInitParam(name="password",value="123")
}
)
当同时有urlPattern和servletNames,则先对比urlPattern 再对比servletNames
多个过滤器
一个servlet可以同时有多个过滤器,执行时,按照web.xml先后顺序组装成一条链,执行完毕后,限制性最后进来执行的过滤器,即后进先出,类似于栈。
同时具有两个过滤器的情况:
// FirstFilter
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("start-doFilter---FirstFilter");
arg2.doFilter(arg0, arg1);
System.out.println("end-doFilter---FirstFilter");
}
// SecondFilter
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("start---doFilter---SecondFilter");
chain.doFilter(request, response);
System.out.println("end---doFilter---SecondFilter");
}
// 结果:
start-doFilter---FirstFilter
start---doFilter---SecondFilter
end---doFilter---SecondFilter
end-doFilter---FirstFilter
过滤器类别
- request 用户直接访问页面时,调用过滤器
- forward 通过RequestDispatcher的forward访问时调用过滤器
- include 通过RequestDispatcher的include访问时调用过滤器
- error 一场处理机制调用时,调用过滤器
- async 异步
当Test1被forward方式访问时,触发FirstFilter过滤器
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<url-pattern>/Test1</url-pattern>
<dispatcher>forward</dispatcher>
</filter-mapping>
触发方式
// Servlet
RequestDispatcher dispatch = req.getRequestDispatcher("/Test1").forward(req, resp);
// JSP
<jsp:forward page="index.jsp"></js
error
error-page可以在发生特定的错误时,跳转到指定的页面
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
由error-page跳转的页面需要经过error类型的过滤器,配置dispatcher后,发生错误时,过滤器可以采取相应措施
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<url-pattern>/error.jsp</url-pattern>
<dispatcher>error</dispatcher>
</filter-mapping>