servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
创始人
2024-05-17 09:42:40
0

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

  • servlet过滤器
    • 1.filter过滤器的含义
    • 2.filter过滤器的使用
    • 3.测试-过滤字符编码正确响应中文编码
      • 3.1 创建servlet用于显示中文字符
      • 3.2 自定义过滤器
      • 3.3 配置web.xml中的servlet映射以及过滤器请求拦截
      • 3.4 运行输出
    • 4. / 和 /* 以及 /** 的区别

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 {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {// 编写自己的业务逻辑代码即可}@Overridepublic void destroy() {Filter.super.destroy();}
}

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

 	MyFilter com.robin.filter.MyFilterMyFilter /servlet/*

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 {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("我是中文字符");}@Overrideprotected 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 {// 过滤器初始化@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("CharacterEncodingFilter初始化");Filter.super.init(filterConfig);}//@Overridepublic 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过滤器执行之后");}// 过滤器销毁@Overridepublic void destroy() {System.out.println("CharacterEncodingFilter销毁");Filter.super.destroy();}
}

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


ShowServletcom.robin.servlet.ShowServletShowServlet/servlet/ShowShowServlet/ShowCharacterEncodingFiltercom.robin.filter.CharacterEncodingFilterCharacterEncodingFilter/servlet/*

3.4 运行输出

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

在这里插入图片描述

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

在这里插入图片描述

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

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

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

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

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


相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...