当前位置: 首页 > 图灵资讯 > 技术篇> Servlet添加自定义的过滤器没有效果?

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

来源:图灵教育
时间:2023-04-27 09:27:58

在学习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> 指定参数的值。

如何配置过滤器?

一、先加一对<filter></filter>三个标签通常放在里面,<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在这里拦截的是Filterservleturl),如果是/*,则拦截所有请求。

    <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只要过滤映射地址不重复,就可以有多个过滤器。