servlet容器的工具:Filter

介绍

javax.servlert.Filter是servlert里常用的工具,能够对servlet容器的请求和响应进行修改和检查,是个典型的处理链。可以认为是servlet的一个变种,它与servlet的区别在于:他不能直接为用户生成响应,只提供过滤功能。

执行流程

当一个请求满足了一个filter的过滤条件后,请求会被移交到下一个filter处理。这就涉及到了过滤链FilterChain。服务器会按照web.xlm中定义的filter组装成一条过滤链,依次执行其 doFilter()方法。

过滤器的生命周期

每个过滤器都要实现 javax.servlert.Filter,Filter只有三个方法,对应着Filter的生命周期

public interface Filter {
    //初始化过滤器,servlet容器创建过滤器实例将调用该方法,该方法读取web.xml文件里的配置初始化参数。
    void init(FilterConfig var1) throws ServletException;
    //执行过滤内容
    void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
    //销毁实例,servlet容器在销毁过滤器时调用该方法,释放过滤器占用的资源。
    void destroy();
}

再来看看FilterChain源码:

public interface FilterChain {
    //filter调用此方法执行下一个filter
    void doFilter(ServletRequest var1, ServletResponse var2) throws IOException, ServletException;
}

FilterConfig

public interface FilterConfig {
    //返回web.xml中定义的该过滤器的名称
    String getFilterName();
    //返回调用者所处的servlet上下文环境
    ServletContext getServletContext();
    //返回过滤器初始化参数值的字符串形式
    String getInitParameter(String var1);
    //以Enumeration形式返回过滤器所有初始化参数值,如果没有初始化参数,返回null.
    Enumeration getInitParameterNames();
}

代码示例

web.xlm 配置

  <filter>
      <filter-name>myFilter</filter-name>
      <filter-class>com.filter.MyFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>myFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

实现:

public class MyFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {

            String name = filterConfig.getFilterName();
            System.out.println("my filter name:" + name);

            Student student = new Student();
            student.setEmail("asdasdas");
            context.setAttribute("myself", student);
            Student studentFromContext = (Student) context.getAttribute("myself");
            System.out.println(studentFromContext.getEmail());
        }

        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            String addr = servletRequest.getRemoteAddr();
            if (addr.equals("10.1.6.77")) {
                servletResponse.setLocale(new Locale("en_w"));
            }
            if (addr.equals("10.1.6.56")) {
                //在响应头设置session状态
                servletResponse.getWriter().write("非法请求...");
                servletResponse.getWriter().write("<script>$(function (){window.location.href('/user/login.do');});</script>");
            }
            filterChain.doFilter(servletRequest, servletResponse);
        }

        @Override
        public void destroy() {

        }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值