servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别

简介: 本文简要回顾了Servlet过滤器Filter的概念和使用,通过实例演示了如何创建过滤器以过滤请求字符编码,并解释了在web.xml中配置过滤器时使用`/`、`/*`和`/**`的区别。

servlet过滤器

1.filter过滤器的含义

它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。servlet的过滤器,通过实现Filter接口来实现。

过滤器的本质:过滤一些非法请求(常见的场景就是非法登录验证,以及一些需要登录后才能去访问的页面和资源),在浏览器和服务器响应中间添加一个拦截过滤请求的容器。

比如针对非法登录的用户的请求过滤:
当我们使用了Filter过滤器的时候,同样的场景,用户每一次发送请求的时候都要经过Filter过滤器,那么我们可以在过滤器里面编辑逻辑代码,进行判断当用户没有登录的时候,我们就让他跳转到提示错误的页面,在提示错误的页面里提示他只有登录了之后才可以访问系统主页。

在这里插入图片描述

2.filter过滤器的使用

首先,需要引入对应的包 javax.servlet,和HttpServlet是同一个包下。

filter接口源码:

package javax.servlet;

import java.io.IOException;

public interface Filter {
   
    default void init(FilterConfig filterConfig) throws ServletException {
   
    }

    void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;

    default void destroy() {
   
    }
}

创建一个类,实现filter接口,并且重写它的三个方法即可:

package com.robin.filter;

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

public class MyFilter implements Filter {
   
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
   
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
   
        // 编写自己的业务逻辑代码即可
    }

    @Override
    public void destroy() {
   
        Filter.super.destroy();
    }
}

接着,去web.xml中配置过滤器:

     <!--  过滤器配置  -->
    <filter>
         <!-- 过滤器名 -->
        <filter-name>MyFilter </filter-name>
         <!--过滤器对应的全类名 -->
        <filter-class>com.robin.filter.MyFilter</filter-class>
    </filter>
    <!--过滤器拦截请求映射 -->
    <filter-mapping>
        <!-- 过滤器名与上面的一致 -->
        <filter-name>MyFilter </filter-name>
        <!--   过滤请求配置 下面的相当于过滤servlet包下的所有请求   -->
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>

3.测试-过滤字符编码正确响应中文编码

3.1 创建servlet用于显示中文字符

package com.robin.servlet;

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

public class ShowServlet extends HttpServlet {
   

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        resp.getWriter().write("我是中文字符");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        doGet(req, resp);
    }
}

3.2 自定义过滤器

package com.robin.filter;

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

/**
 * 自定义字符过滤器
 */
public class CharacterEncodingFilter implements Filter {
   

    // 过滤器初始化
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
   
        System.out.println("CharacterEncodingFilter初始化");
        Filter.super.init(filterConfig);
    }

    //
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
   
        // 设置过滤器的功能
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=utf-8");

        System.out.println("CharacterEncodingFilter过滤器执行之前");
        // 将自定义过滤器加入过滤器链中 filterChain 如果不加入链中,是无法执行过滤器的功能,以及拦截请求
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("CharacterEncodingFilter过滤器执行之后");
    }

    // 过滤器销毁
    @Override
    public void destroy() {
   
        System.out.println("CharacterEncodingFilter销毁");
        Filter.super.destroy();
    }
}

3.3 配置web.xml中的servlet映射以及过滤器请求拦截

<?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">
    <!--  servlet映射配置  -->
    <servlet>
        <servlet-name>ShowServlet</servlet-name>
        <servlet-class>com.robin.servlet.ShowServlet</servlet-class>
    </servlet>
    <!-- 配置第一个映射,走过滤器的映射   -->
    <servlet-mapping>
        <servlet-name>ShowServlet</servlet-name>
        <url-pattern>/servlet/Show</url-pattern>
    </servlet-mapping>
    <!--  第二个映射,不走过滤器,则显示字符会乱码  -->
    <servlet-mapping>
        <servlet-name>ShowServlet</servlet-name>
        <url-pattern>/Show</url-pattern>
    </servlet-mapping>

    <!--  过滤器配置  -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.robin.filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <!--   过滤servlet下的所有请求     -->
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>
</web-app>

3.4 运行输出

先访问走过滤器的请求http://localhost:8080/servlet/Show,字符正确显示

在这里插入图片描述

访问不会走过滤器的请求http://localhost:8080/Show,则输出乱码

在这里插入图片描述

其余的非法登录验证,以及敏感字符请求过滤等,本质都一样,大家可以自行测试

4. / 和 /* 以及 /** 的区别

  1. /
    <url-pattern>/</url-pattern>
    解释:会匹配到/login这样的路径型url,.js和.html等静态资源,不会匹配到*.jsp页面

  2. /*
    <url-pattern>/*</url-pattern>
    解释:会匹配所有url(只匹配当前文件夹下文件,不匹配子文件夹下文件),包括*.jsp页面

  3. /**
    <url-pattern>/**</url-pattern>
    解释:会匹配所有url(匹配当前文件夹下文件和子文件夹下文件):路径型的和后缀型的url(包括/login,.jsp,.js和*.html等)


相关文章
|
4月前
|
存储 前端开发 Java
servlet过滤器--使用过滤器统计网站访问人数的计数(注解形式)
该文章展示了如何使用Servlet过滤器(Filter)通过注解方式创建一个网站访问人数统计功能,通过`@WebFilter`注解定义过滤器及其URL模式,并在`doFilter`方法中实现计数逻辑,将访问次数存储在`ServletContext`中,最后在JSP页面展示访问人数。
servlet过滤器--使用过滤器统计网站访问人数的计数(注解形式)
|
6月前
|
NoSQL Java Redis
深入理解Servlet Filter及其限流实践
深入理解Servlet Filter及其限流实践
172 44
|
4月前
|
C# 数据可视化 开发者
WPF开发者福音:深度解析OxyPlot与LiveCharts图表库,轻松实现数据可视化不再是难题!
【8月更文挑战第31天】在WPF应用中,数据可视化对提升用户体验至关重要。本文介绍并演示了两种流行图表库OxyPlot和LiveCharts的集成与使用方法。OxyPlot是一款适用于.NET应用的开源图表库,提供多种图表类型,易于集成。LiveCharts则以其丰富的图表类型和动画效果,特别适合实时数据展示。通过具体代码示例,本文展示了如何利用这两种图表库创建折线图和柱状图,并详细说明了安装和配置步骤。希望本文能帮助开发者在WPF应用中轻松实现高效、美观的数据可视化。
217 0
|
4月前
|
监控 前端开发 Java
揭秘Web开发神器:Servlet、过滤器、拦截器、监听器如何联手打造无敌博客系统,让你的用户欲罢不能!
【8月更文挑战第24天】在Java Web开发中,Servlet、过滤器(Filter)、拦截器(Interceptor,特指Spring MVC中的)及监听器(Listener)协同工作,实现复杂应用逻辑。以博客系统为例,Servlet处理文章详情请求,过滤器(如LoginFilter)检查登录状态并重定向,Spring MVC拦截器(如LoggingInterceptor)提供细粒度控制(如日志记录),监听器(如SessionListener)监控会话生命周期事件。这些组件共同构建出高效、有序的Web应用程序。
42 0
|
5月前
|
XML Java 数据格式
jsp和servlet有什么区别?
总的来说,JSP和Servlet都是创建动态Web应用程序的重要工具,但它们的使用依赖于特定的需求和上下文。
44 0
|
5月前
|
XML Java 数据格式
jsp和servlet有什么区别?
总的来说,JSP和Servlet都是创建动态Web应用程序的重要工具,但它们的使用依赖于特定的需求和上下文。
42 0
|
4月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
38 3
|
4月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
35 1
|
4月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
66 0
|
4月前
|
前端开发 安全 Java
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
30 0