文章目录:
1.介绍
Filter接口来自于Servlet规范。
Filter接口实现类由项目开发人员实现。
Filter接口可以在tomcat调用资源文件之前进行拦截 。
2.作用
拦截tomcat之后,帮助tomcat检测本次请求合法性。
拦截tomcat之后,对本次拦截的请求做增强服务。
3.Filter接口实现类开发步骤
创建Filter接口实现类。
重写doFilter方法。
在web.xml中注册过滤器接口实现类。
4.过滤器接口的第一个例子
拦截tomcat之后,帮助tomcat检测本次请求合法性。
package com.songzihao.filter; import javax.servlet.*; import java.io.IOException; /** * */ public class OneFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //从拦截得到的请求对象中的请求头参数,得到用户年龄 String age=servletRequest.getParameter("age"); //根据用户年龄判断本次请求是否合法 if (Integer.valueOf(age)<70) { filterChain.doFilter(servletRequest,servletResponse); }else { servletResponse.setContentType("text/html;charset=utf-8"); servletResponse.getWriter().print("抱歉,您无法查看此图片!!!"); } } }
在web目录下任意添加一张图片
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- 声明一个变量存储过滤器接口实现类的全限定名称 --> <filter> <filter-name>oneFilter</filter-name> <filter-class>com.songzihao.filter.OneFilter</filter-class> </filter> <!-- 通知tomcat在调用何种文件之前需要由过滤器进行拦截 --> <filter-mapping> <filter-name>oneFilter</filter-name> <url-pattern>/美国队长.jpg</url-pattern> </filter-mapping> </web-app>
通过在浏览器中输入参数 age 的值。
当小于70时,filterChain 这个过滤器链条对象,将会把拦截到的请求对象和响应对象,重新交还给tomcat,tomcat将相应的信息写入响应体中,推送给浏览器。
当大于等于70时,就没必要去找tomcat了,直接进行拦截,通过响应对象获取输出流,将对应的信息直接返回给浏览器。
5.过滤器接口的第二个例子
拦截tomcat之后,对本次拦截的请求做增强服务。
当请求对象中的信息到达tomcat之前,对请求体(浏览器以post方式发起请求,写入请求体)中的内容进行 utf-8 字符集解析。之后过滤器链条对象 filterChain 将拦截对象进行放行,此时到达tomcat之后,就是正确的 utf-8 字符集。
package com.songzihao.controller; import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; public class OneServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //得到请求对象之后,直接从请求体中读取参数信息 String value=request.getParameter("userName"); System.out.println("从请求体读取到的参数信息===" + value); } }
package com.songzihao.filter; import javax.servlet.*; import java.io.IOException; /** * */ public class OneFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //在请求对象到达目的地之前,对请求对象进行增强处理 servletRequest.setCharacterEncoding("utf-8"); //放行 filterChain.doFilter(servletRequest,servletResponse); } }
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- 声明一个变量存储过滤器接口实现类的全限定名称 --> <filter> <filter-name>oneFilter</filter-name> <filter-class>com.songzihao.filter.OneFilter</filter-class> </filter> <!-- 通知tomcat在调用何种文件之前需要由过滤器进行拦截 --> <filter-mapping> <filter-name>oneFilter</filter-name> <url-pattern>/one</url-pattern> </filter-mapping> <servlet> <servlet-name>OneServlet</servlet-name> <servlet-class>com.songzihao.controller.OneServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>OneServlet</servlet-name> <url-pattern>/one</url-pattern> </servlet-mapping> </web-app>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/myWeb/one" method="post"> 参数:<input type="text" name="userName" /><br/> <input type="submit" value="post方式访问OneServlet" /> </form> </body> </html>
6.过滤器拦截地址
1)通知tomcat调用某个具体资源文件时需要调用当前过滤器
<url-pattern>/文件名.后缀名</url-pattern>
2)通知tomcat调用某个文件夹下资源文件时需要调用当前过滤器
<url-pattern>/文件夹名/*</url-pattern>
3) 通知tomcat调用某种类型文件时需要调用当前过滤器
<url-pattern>*.jpg</url-pattern>
4) 通知tomcat在调用当前网站下任意资源文件时需要调用当前过滤器
<url-pattern>/*</url-pattern>