首页 > 其他分享 >Servlet添加自定义的过滤器没有效果?

Servlet添加自定义的过滤器没有效果?

时间:2023-04-25 12:07:50浏览次数:41  
标签:FilterServlet ServletException 自定义 void 元素 过滤器 Servlet response

在学习HttpServlet的时候有个自定义过滤器的定义类,我们想让特定url走过滤器。

public class MyFilter implements Filter {
    private FilterConfig config;
    public void init(FilterConfig config) throws ServletException {
        this.config = config;
    }
    public void destroy() {
        System.out.println("销毁");
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        Enumeration<String> initParameterNames = config.getInitParameterNames();
        //设置向页面输出的格式与编码
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        //通过Filter向页面输出内容
        writer.write("<h3>MyFilter 过滤器...</h3>");
        chain.doFilter(request, response);
        writer.write("<h3>MyFilter 过滤器....</h3>");
        //关闭 writer
        writer.close();
    }
}

但是当我http://localhost:8080/MyServletProject/FilterServlet执行代码时过滤器却没有反应,研究了一下特在此记录一下。

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.*;
import java.io.IOException;
/**
* @author C语言中文网 http://c.biancheng.net
* Filter过滤器:FilterServlet
*/
@WebServlet("/FilterServlet")
public class FilterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().write("<h1>FilterServlet 访问成功</h1>");
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

没有反应是因为我没有在web.xml文件里添加过滤器配置,为什么没有添加过滤器配置呢,是因为添加的时候idea报错如图

Servlet添加自定义的过滤器没有效果?_类名

所以把它删了。

现在来给大家说一下过滤器中的各个标签是做什么的。

  • <filter> 元素:用于注册过滤器
  • <filter-name>元素: 该元素为 <filter> 元素的子元素, 用于指定过滤器的注册名,该元素的内容不能为空。
  • <filter-class> 元素:该元素为 <filter> 元素的子元素,用于指定过滤器的完整限定名(包名+类名)。
  • <init-param> 元素:该元素为 <filter> 元素的子元素,用于为过滤器指定初始化参数,它的子元素 <param-name> 指定参数的名称,<param-value> 指定参数的值。

一个过滤器该怎么配置呢?

1,首先加一对<filter></filter>在里面一般放3个标签,<filter-name>放的是过滤器名称名字可以随便起但一般放类名。<filter-class>放的是这个过滤器全类名就是蓝色java下面的地址,就像我图片里放的那样,<init-param>里面放的是过滤器初始化参数里面放<param-name>和<param-value>,可以有多个参数。然后在过滤器类中就可以获得这里放的名字和值。取的方式是先实现init父类方法,然后获得里面的参数fConfig

public void init(FilterConfig fConfig) throws ServletException {
    this.fConfig = fConfig;
}

然后如下图。

//获取过滤器中的初始化参数
Enumeration<String> blackListNames = fConfig.getInitParameterNames();
while (blackListNames.hasMoreElements()) {
    String value=fConfig.getInitParameter(blackListNames.nextElement());
}

做完这些以后,需要配置这个过滤器的映射,在filter以外创建<filter-mapping>(注意<filter-mapping>和<filter>是同级的),然后这里面放两个参数分别是<filter-name>和<url-pattern>filter-name里面放的是你起的过滤器名称,url-pattern放的是你要拦截的url地址(这个地址不包括项目名称例如:http://localhost:8080/MyServletProject/FilterServlet这里拦的就是FilterServlet这个url),如果是/*的话就拦截所有的请求。

    <filter>
        <filter-name>FilterServlet</filter-name>
        <filter-class>net.biancheng.e.MyFilter</filter-class>
        <init-param>
            <param-name>name</param-name>
            <param-value>编程帮</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>FilterServlet</filter-name>
        <url-pattern>/FilterServlet</url-pattern>
    </filter-mapping>

一个web.xml可以有多个过滤器,只要过滤映射地址不重复就行。

标签:FilterServlet,ServletException,自定义,void,元素,过滤器,Servlet,response
From: https://blog.51cto.com/u_15869608/6223696

相关文章

  • 【HarmonyOS】自定义组件之JavaUI实现通用标题栏组件
    【关键字】标题栏、常用内置组件整合、JavaUI、自定义组件 【1、写在前面】平时我们在开发一个应用时,我们都知道一个完整的项目中会有很多个页面,而这些页面中会有许多通用的部分,比如通用标题栏、通用Dialog、通用下拉菜单等等,在Android开发中我们可以通过LayoutInflater.from......
  • P.-7如何查看具体的过滤器、P.-8认证流程图讲解
    P.-7如何查看具体的过滤器​我们可以通过Debug查看当前系统中SpringSecurity过滤器链中有哪些过滤器及它们的顺序。P.-8认证流程图讲解(了解即可)概念速查:Authentication接口:它的实现类,表示当前访问系统的用户,封装了用户相关信息。Authenticat......
  • 自定义Python版本ESL库访问FreeSWITCH
    环境:CentOS7.6_x64Python版本:3.9.12FreeSWITCH版本:1.10.9一、背景描述ESL库是FreeSWITCH对外提供的接口,使用起来很方便,但该库是基于C语言实现的,Python使用该库的话需要使用源码进行编译。如果使用系统自带的Python版本进行编译,过程会比较流畅,就不描述了。这里记录下使用自定义......
  • 其它权限校验方法 自定义权限校验方法
    我们前面都是使用@PreAuthorize注解,然后在在其中使用的是hasAuthority方法进行校验。SpringSecurity还为我们提供了其它方法例如:hasAnyAuthority,hasRole,hasAnyRole等。​这里我们先不急着去介绍这些方法,我们先去理解hasAuthority的原理,然后再去学习其他方法你就更容易理解,而不是......
  • skywalking自定义插件开发
    skywalking是使用字节码操作技术和AOP概念拦截Java类方法的方式来追踪链路的,由于skywalking已经打包了字节码操作技术和链路追踪的上下文传播,因此只需定义拦截点即可。这里以skywalking-8.7.0版本为例。关于插件拦截的原理,可以看我的另一篇文章:skywalking插件工作原理剖析1.......
  • spring boot 过滤器、拦截器的区别和使用
    区别:一、过滤器与拦截器的对比1.使用范围不同:过滤器是基于Servlet,而拦截器是基于Spring的,Spring框架底层又离不开Servlet,所以过滤器也能在Spring体系中使用。2.使用资源不同:拦截器有Spring的支持,能够方便的向容器中注册对象和使用对象,但是过滤器就不能。3.使用场景不同:灵活性上......
  • excel的练习1--自定义单元格格式(win11)
    题目1.4自定义单元格格式。在EXCEL单元格区域设置自定义数字格式,实现如下效果:在该区域的任意单元格输入数字1,则显示为√,其他数据原样显示。则:1.格式定义形式为【1】.【提示:格式-单元格格式-自定义】2.格式定义之后得到的结果B4:F10复制粘贴为文本到第【2】空。答案步骤选......
  • 自定义方法
          ......
  • Springboot将自定义jar包引入pom
    Springboot将自定义jar包引入pom Springboot将自定义jar包引入pom <dependency><groupId>TrendDB_API</groupId><artifactId>TrendDB_API</artifactId><version>1.0</version>......
  • electron鼠标经过托盘显示自定义菜单
    1.自定义菜单//自定义菜单vartemplateMenu=[{label:"首页",submenu:[{label:"111"},{label:'9089'}]},,{label:"编辑",submenu:[{label:'123'}]}]testmenu=Menu.buil......