Filter

释放双眼,带上耳机,听听看~!

概述

在开发中,通过浏览器访问服务器端的目标资源时,过滤器实现拦截功能,如果过滤器判断是合理的请求,就放行,允许访问目标资源。filter是一个双向的过程,请求要经过一次filter,响应回浏览器也还要经过一次filter。

常用方法

  • init方法,在过滤器对象被创建后,执行初始化方法
  • doFilter方法,在这个方法里面实现拦截和放行
  • destroy方法,在过滤器销毁后,执行。

其中dofiter中的chain.doFilter(request,response);表示允许放行所有请求

步骤

1.创建MyServlet,通过浏览器访问这个servlet资源。
2.创建MyFilter,来拦截访问的servelt资源,如果要放行,执行doFilter方法拦截的具体配置,在web.xml配置:
MyFilter /Myservlet—–>如果访问MyServlet资源,过滤器就能实现拦截

Filter映射

1.使用通配符”*”拦截所有的用户请求,配置有三种形式:

  • 完全目录匹配:比如/MyServlet
  • 目录匹配:比如/,/aa/代表拦截aa目录下的所有请求
  • 扩展名匹配:比如.do,.action,错误写法:/*.do

2.拦截不同方式的访问请求:REQUEST(默认的请求式),FORWARD,INCLUDE,ERROR比如:配置拦截方式是REQUEST,就不会再拦截FORWARD这种请求方式了。

拦截请求

这样只要开放了filter中的dofilter方法,就会放行拦截内容

servlet页面

package p01_servlet;

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 A_Request extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public A_Request() {
        super();
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().print("request_contont");;
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

过滤器

package p02_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;
public class A_Filter implements Filter {
    public A_Filter() {
    }
    public void destroy() {
    }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //放行所有拦截
        //chain.doFilter(request, response);
    }
    public void init(FilterConfig fConfig) throws ServletException {
    }

}

xml配置

  <servlet>
    <description></description>
    <display-name>A_Request</display-name>
    <servlet-name>A_Request</servlet-name>
    <servlet-class>p01_servlet.A_Request</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>A_Request</servlet-name>
    <url-pattern>/A_Request</url-pattern>
  </servlet-mapping>
  <filter>
    <display-name>A_Filter</display-name>
    <filter-name>A_Filter</filter-name>
    <filter-class>p02_filter.A_Filter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>A_Filter</filter-name>
    <url-pattern>/A_Request</url-pattern>
  </filter-mapping>

拦截转发

默认的拦截方式是拦截request,所以需要修改配置文件,修改拦截方式,否则只会拦截默认request的内容,不会拦截forward内容。同时也要修改拦截的文件目录。

  <filter>
    <display-name>A_Filter</display-name>
    <filter-name>A_Filter</filter-name>
    <filter-class>p02_filter.A_Filter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>A_Filter</filter-name>
    <url-pattern>/forward.jsp</url-pattern>
    <dispatcher>FORWARD</dispatcher>
  </filter-mapping>

Filter链

通过多个filter对同一个servlet进行过滤。过滤是按照配置文件的filter的顺序来加载的。

  <filter>
    <display-name>B_Filter_1</display-name>
    <filter-name>B_Filter_1</filter-name>
    <filter-class>p02_filter.B_Filter_1</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>B_Filter_1</filter-name>
    <url-pattern>/B_servlet</url-pattern>
  </filter-mapping>
  <filter>
    <display-name>B_Filter_2</display-name>
    <filter-name>B_Filter_2</filter-name>
    <filter-class>p02_filter.B_Filter_2</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>B_Filter_2</filter-name>
    <url-pattern>/B_servlet</url-pattern>
  </filter-mapping>
  <servlet>
    <description></description>
    <display-name>B_servlet</display-name>
    <servlet-name>B_servlet</servlet-name>
    <servlet-class>p01_servlet.B_servlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>B_servlet</servlet-name>
    <url-pattern>/B_servlet</url-pattern>
  </servlet-mapping>

输出内容:

filter01-------start
filter02------start
B_servlet_contont
filter02-------end
filter01-------end

给TA买糖
共{{data.count}}人
人已赞赏
知识分享

Filter实现自动登录

2020-9-15 21:58:00

知识分享

访问servlet自动进行下载

2020-9-15 22:00:00

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索