Servlet高级

本文详细介绍了Servlet Filter的工作原理,包括init、doFilter和destroy方法的作用。通过实例展示了如何创建并配置Filter拦截指定资源,以及如何通过通配符进行路径匹配。同时,解释了不同类型请求的拦截情况,并给出了多个Filter协同工作的例子,展示了Filter链的执行顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

filter拦截过程:
在这里插入图片描述
Filter接口中的三个方法:
init方法:在过滤器对象被创建后,执行初始化方法。
doFilter方法:在这个方法里面实现拦截和放行。
destroy方法:在过滤器销毁后,执行。
实现程序:
package cn.itcast.chapter08.filter;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().print(“hello Filter”);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}

}
在这里插入图片描述
创建MyFilter的Filter类,拦截访问servlet资源,如果要放行,执行doFilter方法:
package cn.itcast.chapter08.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**

  • Servlet Filter implementation class MyFilter
    */
    public class MyFilter implements Filter {

    /**

    • @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
      */
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
      // 允许访问目标资源
      chain.doFilter(request, response);
      System.out.println(“输出内容了,代表拦截响应”);
      }

    /**

    • @see Filter#init(FilterConfig)
      */
      public void init(FilterConfig fConfig) throws ServletException {
      // TODO Auto-generated method stub
      }

}
在web.xml文件中对servlet进行配置:

MyFilter
/MyServlet

filter映射:
使用通配符“*”拦截所有的用户请求:配置有三种形式:
完全目录匹配:比如/MyServlet
目录匹配:比如/,/aa/代表拦截aa目录下的所有请求
扩展名匹配:比如
.do,
.action,错误写法:/*.do
拦截不同方式的访问请求:
REQUEST:当用户直接访问页面时,web容器将会调用过滤器
INCLUDE:如果目标资源时通过RequestDispatcher的include()方法访问的,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD:如果目标资源时通过RequestDispatcher的forward()方法访问的,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
ERROR:如果目标资源时通过声明式异常处理机制调用的,那么该过滤器将被调用

filter链:
创建两个过滤器MyFilter01和MyFilter02:
MyFilter01:

packagecn.itcast.chapter08.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**

  • Servlet Filter implementation class MyFilter01
    */
    public class MyFilter01 implements Filter {

    /**

    • @see Filter#destroy()
      */
      public void destroy() {
      // TODO Auto-generated method stub
      }

    /**

    • @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
      */
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
      response.getWriter().print(“hello MyFilter01-------before
      ”);
      chain.doFilter(request, response);
      response.getWriter().print(“hello MyFilter01-------after
      ”);
      }

    /**

    • @see Filter#init(FilterConfig)
      */
      public void init(FilterConfig fConfig) throws ServletException {
      // TODO Auto-generated method stub
      }

}
MyFilter02
package itcast.chapter08.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**

  • Servlet Filter implementation class MyFilter02
    */
    public class MyFilter02 implements Filter {

    /**

    • @see Filter#destroy()
      */
      public void destroy() {
      // TODO Auto-generated method stub
      }

    /**

    • @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
      */
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
      response.getWriter().print(“hello MyFilter02-----------before
      ”);
      chain.doFilter(request, response);
      response.getWriter().print(“hello MyFilter02-----------after
      ”);
      }

    /**

    • @see Filter#init(FilterConfig)
      */
      public void init(FilterConfig fConfig) throws ServletException {
      // TODO Auto-generated method stub
      }

}

FilterConfig接口:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值