提到过滤器可以联想到我们生活中饮用水的过滤,就是将水中的杂质过滤掉,同样的web项目中的过滤器是将web客户端向web服务器发送的一些垃圾请求或者是要做一些在访问到服务器之前中间处理的事情是由过滤器来完成的。常见的使用在用户的登录验证,编码格式等处理,像游戏中一些骂人的话发出去后会变成***也是由过滤器来实现的。
过滤器的实现和Servlet请求的是实现是一模一样的,下面是Filter过滤器实现的步骤,就两步。
第一步:导包
<dependencies>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>servlet-apiartifactId>
<version>2.5version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>4.0.1version>
dependency>
第二步:编写过滤器
创建一个CharactorEncodingFilter类(字符编码过滤器)实现Filter类,注一定要导入的是javax.servlet这个包 不能导错
然后重载Filter的三个方法 init、doFilter、destroy。分别对应的是过滤器的初始化和做过滤的操作还有过滤器的销毁
public class CharactorEncodingFilter implements Filter {
//初始化过滤器,在web服务器启动的时候就初始化了
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CharactorEncodingFilter初始化");
}
//filterChain:链 一定做filterChain.doFilter这个方法将请求转发下去起到一个放行的作用
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=UTF-8");
System.out.println("CharactorEncodingFilter开始前...");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("CharactorEncodingFilter结束了...");
}
public void destroy() {
System.out.println("CharactorEncodingFilter销毁");
}
}
然后在编写一个Servlet请求,用于过滤器过滤的实现
public class showServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("你好呀,世界!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
在web.xml中配置Servlet
<servlet>
<servlet-name>showServletservlet-name>
<servlet-class>com.chen.servlet.showServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>showServletservlet-name>
<url-pattern>/servlet/showurl-pattern>
servlet-mapping>
<servlet-mapping>
<servlet-name>showServletservlet-name>
<url-pattern>/showurl-pattern>
servlet-mapping>
然后在web.xml中也配置过滤器Filter
<filter>
<filter-name>CharactorEncodingFilterfilter-name>
<filter-class>com.chen.filter.CharactorEncodingFilterfilter-class>
filter>
<filter-mapping>
<filter-name>CharactorEncodingFilterfilter-name>
//配置下面这个路径就是只要经过/servlet/下的所有请求都要经过过滤器
<url-pattern>/servlet/*url-pattern>
filter-mapping>
启动项目后,可以看到init方法在tomcat启动的时候就初始化了过滤器,如下图可见
然后我们现在试着请求一下/show的servlet请求,如下图没有经过过滤器处理的编码问题是显示的问号乱码,在控制台也没看到打印过滤器执行前和执行后这个两个语句
接着在试着请求/servlet/show的路径请求,可以看到经过了过滤器的编码处理解决了乱码问题
控制台也输出了这个执行前执行后的输出语句
如果过滤器的url-pattern这个标签下设置的是/* 则是访问的 所有请求都会被过滤掉,但是我们一般不会这么做,只会多写几个过滤器对应过滤掉对应模块使用的请求。然后在关闭tomcat服务器时,过滤器会被销毁,打印输出语句可以看到
过滤器的实现很简单,在处理系统的请求中可以起到很好的过滤掉一些垃圾请求和处理一些请求前的数据处理。