美文网首页项目Javaweb…网络
Servlet:第六篇【过滤器基本介绍】

Servlet:第六篇【过滤器基本介绍】

作者: __y | 来源:发表于2018-05-22 14:41 被阅读34次

1.过滤器的基本概念

过滤器(Filter),是Servlet技术的一种应用,使用过滤器可以拦截用户的请求,对用户的请求按一定的规则进行处理(符合则放行)。通过对请求的过滤可以实现用户权限访问控制,编码设置,过滤敏感词汇等操作。

2.工作的原理

image.png

解析:
web浏览器先服务器请求资源的时候再调用service方法之前会调用filter中的doFilter方法,通过doFilter方法中的规则后,可以访问web资源;否则web资源不能被访问

3.生命周期

过滤器的生命周期为:初始化,doFilter,销毁。

4.过滤器的实现步骤:

第一种方式

  • 写一个Filter的类实现Filter接口并重写doFilter方法
  • 在web.xml文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置所能拦截的资源


    image.png

标签解释:

  • description:用于添加描述信息,该元素的内容可为空,这个标签可以不配置;
  • filter-name:指定过滤器的名字,不能为空;
  • filter-class指定过滤器的类;
  • init-param:初始化过滤器加载的时候的参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。不指定初始化参数的话,该标签可不配置

映射:
在web.xml文件中注册了Filter之后,还要在web.xml文件中映射Filter

<!--映射过滤器-->
  <filter-mapping>
      <filter-name>FilterTest</filter-name>
      <!--“/*”表示拦截所有的请求 -->
      <url-pattern>/*</url-pattern>
  </filter-mapping>

  • <filter-mapping>:元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
  • <filter-name>:子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
  • <url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
  • <servlet-name>:指定过滤器所拦截的Servlet名称。
  • <dispatcher>:指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。如下:
<filter-mapping>
    <filter-name>testFilter</filter-name>
    <url-pattern>/index.jsp</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

第二种方式

通过注解的方式:
@WebFilter(filterName = "?", urlPatterns = "/*");

5.过滤链

在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

6.应用举例

登录案例

1.编写serlvetDemo类(service)

package servlet;


import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;

public class ServletDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    public void init() throws ServletException {
        System.out.println("------初始化servlet-----");
        super.init();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获得页面传过来的参数值
        String name = req.getParameter("username");
        String password = req.getParameter("password")  ;
        HttpSession session = req.getSession();
        session.setAttribute("username",name);
        //判断是否相等
        if(name.equals("admin") && password.equals("admin")) {
            System.out.println(name + " " +password);
            //重定向到别的页面
            resp.sendRedirect(req.getContextPath() + "/success.jsp");
        } else {
            resp.sendRedirect(req.getContextPath()+"/fail.jsp");
        }

    }
}

2.编写过滤器

package filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class FirstFilter implements Filter {
    private FilterConfig config;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        config  = filterConfig;
        System.out.println("-----------初始化---------");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("start----doFilter--FirstFilter");
        HttpServletRequest  request = (HttpServletRequest)servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //获得初始化的参数
        String noLoginPaths = config.getInitParameter("noLoginPaths");
        //规范编码格式
        String charset = config.getInitParameter("charset");
        if(charset == null){
            charset = "UTF-8";
        }
        request.setCharacterEncoding(charset);
        HttpSession session = request.getSession();
   
        //放行
        if(noLoginPaths!=null){
            String[] strArray = noLoginPaths.split(";");
            for (int i = 0; i < strArray.length; i++) {

                if(strArray[i]==null || "".equals(strArray[i]))continue;

                if(request.getRequestURI().indexOf(strArray[i])!=-1 ){
                    //进去下个过滤器或者直接进入servcie
                    filterChain.doFilter(servletRequest, servletResponse);
                    return;
                }
            }

        }


        if(session.getAttribute("username") != null) {
            filterChain.doFilter(servletRequest,servletResponse);
        }else {
            response.sendRedirect("index.jsp");
        }

        System.out.println("end------doFilter--FirstFilter");

    }

    @Override
    public void destroy() {
        System.out.println("destroy---FirstFilter");
    }
}

3.配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <servlet>
        <servlet-name>ServletDemo</servlet-name>
        <servlet-class>servlet.ServletDemo</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletDemo</servlet-name>
        <url-pattern>/servlet/ServletDemo</url-pattern>
    </servlet-mapping>


    <filter>
        <filter-name>FirstFilter</filter-name>
        <filter-class>filter.FirstFilter</filter-class>
        <init-param>
                <param-name>noLoginPaths</param-name>
                <param-value>index.jsp;fail.jsp;ServletDemo</param-value>
        </init-param>
        <init-param>
                <param-name>charset</param-name>
                <param-value>UTF-8</param-value>
        </init-param>

    </filter>
    <filter-mapping>
        <filter-name>FirstFilter</filter-name>
        <url-pattern>/*</url-pattern>
        
    </filter-mapping>
</web-app>

相关文章

  • Servlet:第六篇【过滤器基本介绍】

    1.过滤器的基本概念 过滤器(Filter),是Servlet技术的一种应用,使用过滤器可以拦截用户的请求,对用户...

  • 过滤器

    Servlet分3中: 简单Servlet 过滤器Servlet 监听器Servlet 过滤器的基本概念 Filt...

  • Servlet学习6--过滤器

    一.过滤器Filter Filter介绍Servlet有三大组件:Servlet,Filter,Listener....

  • 2022-03-21 Web基础知识(7)- Servlet (

    Servlet Filter(过滤器)、Servlet FilterChain(过滤器链)、Servlet Fil...

  • JavaWeb(十五)Filter

    1、Filter(过滤器)简介 (1)Filter 的基本功能是对 Servlet 容器调用 Servlet 的过...

  • 过滤器和监听器

    过滤器和监听器 主要内容 过滤器 介绍 ​ Filter 即为过滤,用于在 Servlet 之外对 Request...

  • Spring MVC之拦截器、过滤器学习

    过滤器使用 过滤器是属于Servlet,在javax.servlet.*下面。 添加servlet组件扫描 创建过...

  • 过滤器

    什么是过滤器 Filter 的基本功能是对 Servlet 容器调用 Servlet 的过程进行拦截,从而在 Se...

  • Filter过滤器与监听器

    什么是过滤器 Filter 的基本功能是对 Servlet 容器调用 Servlet 的过程进行拦截,从而在 Se...

  • JavaWeb之Filter过滤器

    什么是过滤器 Filter 的基本功能是对 Servlet 容器调用 Servlet 的过程进行拦截,从而在 Se...

网友评论

    本文标题:Servlet:第六篇【过滤器基本介绍】

    本文链接:https://www.haomeiwen.com/subject/jcdhjftx.html