servlet容器的工具:Filter

来源:互联网 发布:软件开发报价清单 编辑:程序博客网 时间:2024/05/31 19:39

  • 介绍
  • 执行流程
  • 过滤器的生命周期
  • 代码示例

介绍

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
原创粉丝点击