Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。
过滤器的作用:
1、身份验证过滤器
2、日志记录和审核过滤器
3、触发资源访问事件过滤器。
等等等。。。
Servlet 过滤器方法
过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类。javax.servlet.Filter 接口定义了三个方法
序号 | 方法 & 描述 |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) 该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。 |
2 | public void init(FilterConfig filterConfig) web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。 |
3 | public void destroy() Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。 |
使用实例:
建一个类,实现 javax.servlet.Filter 接口,重写里面的方法
package com.maya.filter; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class Testfilter implements Filter { ArrayList<String> list=new ArrayList<String>(); @Override public void destroy() { // } @Override //每次请求执行的代码 public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { HttpServletRequest request=(HttpServletRequest)arg0; //HttpServletRequest 是 ServletRequest的子类, 我们常用的request 是 httpservletRequest HttpServletResponse response=(HttpServletResponse)arg1; //同上 response.setCharacterEncoding("utf-8"); //请求和响应的编码格式 request.setCharacterEncoding("utf-8"); String s1=request.getRequestURI(); //获取页面地址: /GuoLvQi/denglu.jsp String s2=request.getContextPath(); // /GuoLvQi String s3=s1.substring(s2.length()); //截取,最后剩下 /denglu.jsp if(list.contains(s3)){ //返回的结果为true 则进入下一个过滤器 arg2.doFilter(request, response); //进入下一个过滤器 } else{ HttpSession session=request.getSession(); //获取session if(session.getAttribute("user")==null){ response.sendRedirect("denglu.jsp"); //如果获取不到,就转回登陆页面 } else{ arg2.doFilter(request, response); //获取到了 进入下一个过滤器 } } } @Override //第一遍要执行的代码 public void init(FilterConfig arg0) throws ServletException { String values=arg0.getInitParameter("kefangwen"); //读配置文件 String[] str=values.split(","); //将字符串变成一个数组来接收 list.addAll(Arrays.asList(str)); //将数组变成集合,也可以用for循环来添加 } }
web.xml中的配置(复制粘贴)
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <filter> <filter-name>testfilter</filter-name> <!-- 过滤器的名字 --> <filter-class>com.maya.filter.Testfilter</filter-class> <!-- 引用的类的路径 com.maya.filter 是包名 Testfilter是类名 --> <init-param> <param-name>kefangwen</param-name> <!--属性名称 过滤器可调用的属性 --> <param-value>/index.jsp,/index,main./jsp,main,/denglu.jsp</param-value> <!-- value值 --> </init-param> </filter> <filter-mapping> <!-- 映射 --> <filter-name>testfilter</filter-name> <!--同一个过滤器的映射名要跟过滤器的名字相对应 --> <url-pattern>/*</url-pattern> <!-- /*表示该文件夹下所有web程序执行的时候都需要经过该过滤器 --> </filter-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
当我在地址栏输入其他页面时 若session没有值时,就会自动跳至denglu.jsp
回车之后。。。