Web阶段:第十八章:Filter过滤器

简介: Web阶段:第十八章:Filter过滤器

Filter,什么是过滤器?

1.Filter过滤器是javaWeb的三大组件之一,

2.三大组件分别是:Servlet程序,Filter过滤器,Listener监听器。

3.Filter是接口。

4.Filter的作用是:拦截请求,过滤响应。

Filter的初体验

需求:在webContent目录下有一个admin目录。然后在这个目录下有html页面,jsp页面,jpg图片。

要求这个目录下所有的资源都必须登录之后才能访问。

我们可以在jsp页面中,通过判断,Session域中是否包含用户登录的信息。

如果Session有用户登录的信息,说明已经登录,允许访问。返回,则让页面跳转到登录页面。

<%
  Object user = session.getAttribute("user");
  // 用户没登录
  if (user == null) {
    request.getRequestDispatcher("/login.jsp").forward(request, response);
    return;
  }
%>

如何使用Filter来保持Admin下的资源,在登录之后才允许访问。

Filter的使用步骤:

1、编写一个类去实现Filter接口

2、实现doFilter拦截的方法。

3、到web.xml中去配置拦截的资源地址

AdminFilter的代码:

public class AdminFilter implements Filter {
  /**
   * doFilter方法在每次拦截到请求之后就会调用
   */
  @Override
  public void doFilter(ServletRequest request, ServletResponse response,
      FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    //做拦截检查的工作
    Object user = httpRequest.getSession().getAttribute("user");
    // 用户没登录
    if (user == null) {
      request.getRequestDispatcher("/login.jsp").forward(request, response);
      return;
    } else {
      // 已经登录
      chain.doFilter(request, response);
    }
  }
}

web.xml中的配置:

<!-- Filter标签 配置Filter过滤器 -->
<filter>
  <filter-name>AdminFilter</filter-name>
  <filter-class>com.atguigu.filter.AdminFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>AdminFilter</filter-name>
  <!-- 
    /admin/* 表示 http://ip:port/工程名/admin/* 全部资源
   -->
  <url-pattern>/admin/*</url-pattern>
</filter-mapping>

login.jsp页面

<body>
  <form action="${ pageContext.request.contextPath }/loginServlet" method="post">
    用户名:<input type="text" name="username" /><br/>
    密码:<input type="password" name="password"/><br/>
    <input type="submit" />
  </form>
</body>

LoginServlet程序

public class LoginServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;
  protected void doPost(HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException {
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    if ("wzg168".equals(username) && "123456".equals(password)) {
      request.getSession().setAttribute("user", username);
      System.out.println("登录成功!");
    } else {
      System.out.println("登录失败!");
    }
  }
}

Filter的生命周期

1、Filter的构造器方法
2、执行init初始化操作
3、执行doFilter过滤方法    每次拦截都会执行
4、执行destroy销毁方法

FilterConfig 类

FilterConfig类封装了Filter过滤器的配置信息。

作用:

1、获取filter-name的值 过滤器的别名

2、获取init-param初始化参数

3、获取ServletContext对象

@Override
public void init(FilterConfig filterConfig) throws ServletException {
  // TODO Auto-generated method stub
  // System.out.println("2、init");
  // 作用:
  // 1、获取filter-name的值 过滤器的别名
  System.out.println("Filter的名称:" + filterConfig.getFilterName());
  // 2、获取init-param初始化参数
  System.out.println("Filter的初始化参数url值是:"
      + filterConfig.getInitParameter("url"));
  // 3、获取ServletContext对象
  System.out.println( filterConfig.getServletContext() );
}

web.xml中的配置信息:

  <filter>
    <filter-name>AdminFilter</filter-name>
    <filter-class>com.atguigu.filter.AdminFilter</filter-class>
    <init-param>
      <param-name>url</param-name>
      <param-value>jdbc:mysql://localhost:3306/test</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>AdminFilter</filter-name>
    <url-pattern>/admin/*</url-pattern>
  </filter-mapping>

FilterChain 过滤器链

Filter 过滤器

Chain 链条

FilterChain 过滤器链

Filter1

@Override
public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException {
  System.out.println("Filter1 前置代码");
  System.out.println("Filter1中获取请求参数:" + request.getParameter("username"));
  System.out.println("Filter1 当前线程 ==>> " + Thread.currentThread().getName() );
  chain.doFilter(request, response);
  System.out.println("Filter1 后置代码");
}

Filter2

@O@Override
public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException {
  System.out.println("Filter2 前置代码");
  System.out.println("Filter2中获取请求参数:" + request.getParameter("username"));
  System.out.println("Filter2 当前线程 ==>> " + Thread.currentThread().getName() );
  chain.doFilter(request, response);
  System.out.println("Filter2 后置代码");
}

target.jsp页面

<body>
  <%
    System.out.println("target.jsp执行……");
    System.out.println("target.jsp页面中获取请求参数:" + request.getParameter("username"));
    System.out.println("target.jsp 当前线程 ==>> " + Thread.currentThread().getName() );
  %>
</body>

Filter的拦截路径

--精确匹配
<url-pattern>/target.jsp</url-pattern>
以上的拦截地址,只有当用户请求地址为:http://ip:port/工程名/target.jsp的时候,Filter就会执行。
--目录匹配
<url-pattern>/admin/*</url-pattern>
以上的拦截地址,只有当用户请求地址为:http://ip:port/工程名/admin/下所有资源,的时候就会执行Filter

–后缀名匹配

<url-pattern>*.jsp</url-pattern>
以上的拦截地址。表示只要用户访问的地址是以.jsp结尾,就会拦截。
<url-pattern>*.html</url-pattern>
以上的拦截地址。表示只要用户访问的地址是以.html结尾,就会拦截。
<url-pattern>*.do</url-pattern>
以上的拦截地址。表示只要用户访问的地址是以.do结尾,就会拦截。
<url-pattern>*.action</url-pattern>
以上的拦截地址。表示只要用户访问的地址是以.action结尾,就会拦截。

对于Filter过滤器来说,只要请求的地址匹配上。就会执行Filter过滤器。

它不关心请求的资源是否存在!

相关文章
|
8月前
|
XML 开发框架 Java
Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)
Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)
|
8月前
|
XML 监控 Java
Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)4
Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)4
|
8月前
|
存储 安全 Java
Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)3
Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)3
|
8月前
|
Java 应用服务中间件 API
Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)2
Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)2
|
9月前
|
XML 数据格式
告别web.xml映射Servlet、Filter、Listener,解锁注解新方式开发
告别web.xml映射Servlet、Filter、Listener,解锁注解新方式开发
|
11月前
|
Java 数据安全/隐私保护
【Java Web编程 十】深入理解Servlet过滤器
【Java Web编程 十】深入理解Servlet过滤器
92 0
|
11月前
|
存储 JavaScript 前端开发
web前端面试高频考点——Vue3.x升级的重要功能(emits属性、生命周期、多事件、Fragment、移出.async、异步组件写法、移出 filter、Teleport、Suspense...)
web前端面试高频考点——Vue3.x升级的重要功能(emits属性、生命周期、多事件、Fragment、移出.async、异步组件写法、移出 filter、Teleport、Suspense...)
161 0
|
12月前
|
缓存 监控 前端开发
Java Web开发中过滤器,拦截器和监听器的区别
Java Web开发中过滤器,拦截器和监听器的区别
57 0
|
存储 Java 数据库
Java Web之Filter过滤器原理简介与功能演示
Filter被称作过滤器,其基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet 进行响应处理前后实现一些特殊功能。
247 0
Java Web之Filter过滤器原理简介与功能演示
|
存储 XML 安全
Java Web 项目入门指南(会话技术[cookie、session]、Filter、Listener)
Java Web 项目入门指南(会话技术[cookie、session]、Filter、Listener)
228 0
Java Web 项目入门指南(会话技术[cookie、session]、Filter、Listener)