过滤器是在运行过程中改变进入资源的请求和资源返回的响应。它是一种代码重用的技术。过滤器通常是修改或调整资源的请求和响应。过滤器有以下几种功能
1、执行请求之前访问资源
2、执行请求之前处理资源的请求
3、更改请求对象的header和更改响应对象的header
4、拦截资源调用后的调用
5、作用在 Servlet,一组 Servlet,或静态内容上的零个,一个或多个拦截器按指定的顺序执行。
使用
实现javax.servlet.Filter并提供一个公共的空参构造来创建过滤器。filter再部署描述符中通过<filter>元素声明,条件通过<filter-mapping>来配置。
web.xml声明
<filter> <filter-name>filter</filter-name> <filter-class>web4.filter</filter-class> </filter> <filter> <filter-name>filter2</filter-name> <filter-class>web4.filter2</filter-class> </filter> <filter-mapping> <filter-name>filter2</filter-name> <servlet-name>filters</servlet-name> </filter-mapping> <filter-mapping> <filter-name>filter</filter-name> <servlet-name>filters</servlet-name> </filter-mapping>
filter过滤器
public class filter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub System.out.println("init------filter"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub System.out.println("doFilter------filter"); //必须添加这句,不然没有办法去调用下一个过滤器,知道匹配完所有过滤器之后,最后一个将去调用web资源,如servlte chain.doFilter(request, response); } @Override public void destroy() { // TODO Auto-generated method stub System.out.println("destroy------filter"); } }
filter2过滤器
filterspublic class filter2 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub System.out.println("init------filter2"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub System.out.println("doFilter------filter2"); chain.doFilter(request, response); } @Override public void destroy() { // TODO Auto-generated method stub System.out.println("destroy------filter2"); } }
@WebServlet(name="filters",urlPatterns="/filter1") public class filters extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("doGet------doGet"); } }
url匹配规则符合 12.2 节“映射规则”,当过滤器中匹配到合适的servltename,按照过滤链中的顺序(<filter-mapping>从上到下的顺序)逐一匹配,知道最后一个过滤器 匹配成功后,调用web资源(servlte或者静态资源),<url-pattern>匹配也是这样子的。过滤器和 RequestDispatcher
使用<dispatcher>来过滤异步请求等的url触发条件
默认可以由一个带有 REQUEST 值的<dispatcher>元素,或者没有任何<dispatcher>元素来表示。
要在分派forward()方法下触发过滤器,<dispatcher>的值就可以是FORWARD
要在分派include()放下触发过滤器,<dispatcher>的值就可以是INCLUDE
要触发错误处理时候触发过滤器,<dispatcher>的值就可以是ERROR
要触发异步处理的dispatch调用处理请求,<dispatcher>的值就可以是ASYNC
或者是以上多种组合在一起
过滤器
最新推荐文章于 2024-01-12 16:40:02 发布