一.介绍
(1)来自于Servlet规范下接口,在Tomcat中存在于servlet-api.jar包
(2)Filter接口实现类由开发人员负责提供,Http服务器不负责提供
(3) Filter接口在Http服务器调用资源文件之前,对Http服务器进行拦截
二.具体作用
1.拦截Http服务器,帮助Http服务器检测当前请求合法性.
2.拦截Http服务器,对当前请求进行增强操作.
三.Filter接口实现类开发步骤
其开发步骤一共有三步:
(1)创建一个Java类实现Filter接口
(2)重写Filter接口中doFilter方法,完成我们具体想要实现的功能。
(3)web.xml将过滤器接口实现类注册到Http服务器(此处我们是tomcat),并且可以设置去通知我们的Tomcat在调用何种资源文件前需要使用我们的过滤器类进行拦截。
四.Filter拦截地址格式
(1) 命令格式:
首先将我们的的Filter接口实现类注册到我们的tomcat容器
<!--将过滤器类文件路径交给Tomcat--> <filter> <filter-name>oneFilter</filter-name> <filter-class>com.bjpowernode.filter.OneFilter</filter-class> </filter> <!--通知Tomcat在调用何种资源文件时需要被当前过滤器拦截--> <filter-mapping> <filter-name>oneFilter</filter-name> <url-pattern>想要拦截的路径</url-pattern> </filter-mapping>
首先使用filter将我们的过滤器接口实现类注册到我们的tomcat,然后此时再使用filter-mapping来指定我们注册到tomcat的过滤器类需要拦截哪个资源文件。
(2)下面我们来介绍下 <url-pattern>中可以放入哪些拦截路径,假设此时我们设置的过滤器类为OneFilter
要求Tomcat在调用某一个具体文件之前,来调用OneFilter拦截
<url-pattern>/img/mm.jpg</url-pattern>
要求Tomcat在调用某一个文件夹下所有的资源文件之前,来调用OneFilter拦截
<url-pattern>/img/*</url-pattern>
要求Tomcat在调用任意文件夹下某种类型文件之前,来调用OneFilter拦截
<url-pattern>*.jpg</url-pattern>
要求Tomcat在调用网站中任意文件时,来调用OneFilter拦截
<url-pattern>/*</url-pattern>
要求Tomcat在调用网站中的某个动态资源文件(servlet实现类)时,来调用OneFilter拦截
<url-pattern>/请求资源别名</url-pattern> 注意:此处的请求资源别名指的是我们在web.xml所设置的访问我们某个servlet实现类时候的请求别名。
当我们在网站中输入 http://localhost:8080/网站名/想要拦截的资源文件/ 这个路径的时候便会先进行拦截,然后再去访问我们的资源文件。
五.代码实现
代码逻辑:当用户在前台进行登录的时候,会输入自己的姓名密码,点击提交后,此时需要一个Filter接口实现类来验证我们输入的姓名密码是否与我们之前注册的账号和密码相同,如果相同的话,此时再继续访问我们点击提交后想要访问的地址,假设此时点击提交后浏览器的访问地址为http://localhost:8080/myweb/one
1:首先我们先编写一个前端页面:里面需要放入我们的登录页面的代码,在action中指定提交后我们想要访问的地址。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登陆界面</title> </head> <body> <form action="/myweb/one"> 用户名称:<input type="text" name="username" /> 用户密码:<input type="password" name="password"/> 提交按钮:<input type="submit" value="提交"> </form> </body> </html>
2:然后再写我们的Filter接口实现类:假设此时之前我们注册的姓名为王五,密码为123。
public class OneFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("utf-8"); String name=servletRequest.getParameter("username"); String password=servletRequest.getParameter("password"); if(name.equals("王五")&&password.equals("123")){ //将拦截请求对象和响应对象交还给Tomcat,由Tomcat继续调用资源文件 filterChain.doFilter(servletRequest,servletResponse); }else{ servletResponse.setContentType("text/html;charset=utf-8"); PrintWriter printWriter=servletResponse.getWriter(); printWriter.print("请重新输入"); } } @Override public void destroy() { } }
注意事项:当if语句中我们校验成功后,需要将我们的拦截请求对象和响应对象交还给Tomcat,由Tomcat继续调用资源文件,所以此时需要我们的过滤器链条对象filterChain调用doFilter方法将拦截请求对象和响应对象交还给Tomcat,注意filterChain所调用的doFilter方法是它自己的,并不是Filter接口类中的doFilter方法,如下图所示:
我们一般将这个交还的动作称为放行。
如果前台用户输入的姓名和密码有误的话,就提醒用户重新输入,此时我们的过滤器代替Http服务器拒绝本次请求
3:编写完我们的过滤器接口实现类OneFilter后,再编写我们的OneServlet接口实现类,此类是当用户校验成功后,继续访问的动态资源文件。
public class OneServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String name=req.getParameter("username"); resp.setContentType("text/html;charset=utf-8"); PrintWriter printWriter=resp.getWriter(); printWriter.print("用户的姓名为"+name); System.out.println(); printWriter.print("用户的密码输入正确"); printWriter.flush(); } }
此处就假设当用户通过校验后,显示姓名和密码正确即可。
4:最后在web.xml文件中进行我们的配置
<?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.bjpowernode.Filter.OneFilter</filter-class> </filter> <filter-mapping> <filter-name>onefilter</filter-name> <url-pattern>/one</url-pattern> </filter-mapping> <servlet> <servlet-name>OneServlet</servlet-name> <servlet-class>com.bjpowernode.controller.OneServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>OneServlet</servlet-name> <url-pattern>/one</url-pattern> </servlet-mapping> </web-app>
注意事项:<filer-mapping>中的<url-pattern>处填写的应该是我们想要拦截的资源路径,因为我们是想在访问OneServlet的时候进行一个校验,所以此处就填写我们的请求别名/one即可。