JavaWeb开发(十三)过滤器Filter

发布于:2025-02-10 ⋅ 阅读:(45) ⋅ 点赞:(0)

1. 过滤器Filter

1.1. Filter介绍

  Filter也称之为过滤器,是JAVA WEB中一门十分实用的技术,通过Filter可以对we5资源进行控制和管理,例如可以对Jsp,Servlet等进行拦截。
  Filter过滤器运行流程:优先于servlet以及jsp之前运行。
  应用场景:可以实现URL级别的权限访问控制、过滤敏感词汇等一些高级功能。
在这里插入图片描述

1.2. 创建一个过滤器

1.2.1. 手动创建

  (1)新建FirstFilter
在这里插入图片描述

package zzs.filter.filter;
import javax.servlet.*;
import java.io.IOException;
public class FirstFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
//        String filterName = filterConfig.getFilterName();
//        String initParameter = filterConfig.getInitParameter("param");
//        ServletContext servletContext = filterConfig.getServletContext();
//        System.out.println(filterName+"--"+initParameter);
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filter运行了");
        filterChain.doFilter(servletRequest,servletResponse);
    }
    @Override
    public void destroy() {

    }
}

  (2)配置
在这里插入图片描述

<?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_4_0.xsd"
         version="4.0">
    <filter>
        <filter-name>first</filter-name>
        <filter-class>zzs.filter.filter.FirstFilter</filter-class>
        <init-param>
            <param-name>param</param-name>
            <param-value>value</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>first</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

  (3)新建TestFilterServlet
在这里插入图片描述

package zzs.filter.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "TestFilterServlet", urlPatterns = "/testFilter")
public class TestFilterServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response)
            throws ServletException, IOException {

    }
    protected void doGet(HttpServletRequest request,
                         HttpServletResponse response)
            throws ServletException, IOException {
//            response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("testFilter已经被访问了");
//            request.getRequestDispatcher("/servlet2").forward(request,response);
    }
}

  (4)运行
  已被过滤
在这里插入图片描述

在这里插入图片描述
  (5)放行运行
  放行

filterChain.doFilter(servletRequest,servletResponse);//放行

在这里插入图片描述
在这里插入图片描述

1.2.2. 自定创建

  New–>Create New Filter
在这里插入图片描述
在这里插入图片描述

package zzs.filter.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(filterName = "TestFilter",urlPatterns = "/*",dispatcherTypes =DispatcherType.REQUEST)
public class TestFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

1.3. Filter生命周期和API

1.3.1. Filter生命周期

  (1)Filter何时创建:服务器启动时就创建该Filter对象
  (2)Filter何时销毁:服务器关闭时Filter销毁

1.3.2. Filter API

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //获取 filter名字
        String filterName = filterConfig.getFilterName();
        //获取 filter参数(初始化信息)
        String initParameter = filterConfig.getInitParameter("param");
        //获取 filter上下文对象
        ServletContext servletContext = filterConfig.getServletContext();
        System.out.println(filterName+"--"+initParameter);
    }

在这里插入图片描述
  FilterChain
  FilterChain:过滤器链对象,通过该对象的doFilter方法可以放行该请求–经常使用,当有多个过滤器的时候doFilter方法会将请求发送给下一个过滤器,直至发送给对应的servlet后者jsp处理。

    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain)
            throws IOException, ServletException {
        System.out.println("filter运行了");
        filterChain.doFilter(servletRequest,servletResponse);//放行
    }

1.4. Filter的基本配置

1.4.1. url-pattern配置

在这里插入图片描述

  (1)以“/”字符开头,并以“/”结尾的字符串用于路径映射
  例如:/net/zixue/

  (2)以“*.”开头的字符串被用于扩展名映射。
  例如 *.jsp
  (3)空字符串(””)是用于指定精确映射应用程序 contextroot 的 URL 模式,例如从 http://www.baidu.com/ 来的请求。
  (4)字符串中仅有“/”字符时,表示应用程序“默认”的servlet。在这种情况下 servlet 路径是请求 URI 去掉context 路径,且路径信息为 null。

1.4.2. dispatcher配置

在这里插入图片描述

  dispatcher:访问的方式(了解)
  (1)REQUEST:默认值,代表直接访问某个资源时执行filter。
  (2)FORWARD:转发时才执行filter。
  (3)INCLUDE:包含资源时执行filter。
  (4)ERROR:发生错误时 进行跳转是执行fi1terASYNC:异步servlet的时候需要使用。

1.4.3. 注解方式和web.xml形式

  注解方式配置:

@WebFilter(filterName ="FirstFilter",urlpatterns ="/*",dispatcherTypes =DispatcherType.REQUEST)
package zzs.filter.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(filterName = "TestFilter",urlPatterns = "/*",dispatcherTypes =DispatcherType.REQUEST)
public class TestFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

1.5. 案例解决中文输出乱码问题

1.5.1. 案例 字符编码Filter

  背景知识:我们在学习过程中发现乱码问题比较常见,比如我们通过response.getWriter0.writer()方法输出汉字的时候必须设置setContentType(),那如果开发过程中每个servlet都要书写这个就很麻烦,因此我们通过Fi1ter过滤器,将所有输入和输的的内容都设置一次编码方式,这样就方便的解决了乱码问题。

1.5.2. 示例

  (1)创建过滤器CharsetFilter

package zzs.filter.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;

@WebFilter(filterName = "CharsetFilter", urlPatterns = "/*",
        initParams = {@WebInitParam(name = "encoding",
                value = "text/html;charset=utf-8")})
public class CharsetFilter implements Filter {

    private String encoding;

    public void destroy() {
        encoding = null;
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        if (encoding != null) {
            resp.setContentType(encoding);
        }
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {
        encoding = config.getInitParameter("encoding");
    }

}

  (2)创建TestFilterServlet

package zzs.filter.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "TestFilterServlet", urlPatterns = "/testFilter")
public class TestFilterServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response)
            throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request,
                         HttpServletResponse response)
            throws ServletException, IOException {
        //response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("testFilter已经被访问了");
        //请求转发
        //request.getRequestDispatcher("/servlet2").forward(request, response);
    }
}

  (3)运行

@WebFilter(filterName = "CharsetFilter", urlPatterns = "/",
        initParams = {@WebInitParam(name = "encoding",
                value = "text/html;charset=utf-8")})

在这里插入图片描述

@WebFilter(filterName = "CharsetFilter", urlPatterns = "/*",
        initParams = {@WebInitParam(name = "encoding",
                value = "text/html;charset=utf-8")})

在这里插入图片描述
  JavaWeb 过滤器Filter示例


网站公告

今日签到

点亮在社区的每一天
去签到