0
点赞
收藏
分享

微信扫一扫

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

老榆 2023-04-25 阅读 83

在学习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添加自定义的过滤器没有效果?_ide

所以把它删了。

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

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

举报

相关推荐

0 条评论