在学习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报错如图所示
所以删除它。
现在让我们谈谈过滤器中的标签是做什么的。
- <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只要过滤映射地址不重复,就可以有多个过滤器。