在学习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> 指定参数的值。
一个过滤器该怎么配置呢?
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