1.过滤器介绍
①过滤器(Filter),Servlet技术中最实用技术,web开发人员通过 Filte r技术,对web服务器管理的所有web资源:例如如Servlet, 从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
②作用:对服务器web资源进行拦截(权限控制,通过拦截资源进行权限控制,是否可以访问)
③如何完成编写过滤器: Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。
说的简单点就是对web发送来的请求进行统一处理,一是提高代码的复用性,提高可维护性,二是过滤器会对请求等进行过滤,满足要求的才会执行servlet服务。而实现的方式则是编写一个类继承Filter接口并实现其中的方法,然后将其配置到指定的服务之前即可。
2.Filter接口,FilterChain接口,FilterConfig接口
①Filter接口
该接口是过滤器类必须实现的接口,该接口中有三个方法。
init(FilterConfig filterConfig):该方法是对filter对象进行初始化的方法,仅在容器初始化filter对象结束后被调用一次。参数FilterConfig可以获得filter的初始化参数.
doFilter(ServletRequest request, ServletResponse response, FilterChain chain):该方法是filter进行过滤操作的方法,是最重要的方法。过滤器实现类必须实现该方法。方法体中可以对request和response进行预处理。其中FilterChain可以将处理后的request和response对象传递到过滤链上的下一个资源。
destroy():该方法在容器销毁过滤器对象前被调用。
②FilterChain接口
该接口类型作为Filter接口中doFilter方法的参数使用。doFilter(ServletRequest request,ServletResponse response),该方法可以将当前的请求和响应传递到过滤链上的下一个资源,可能是下一个过滤器,也可能是目标servlet服务。
③FilterConfig接口
该接口类型作为Filter接口中的init方法的参数使用。getInitParameter(String name),该方法用来获得过滤器的初始化参数值。在web.xml中,可以为每一个filter配置需要的初始化参数,与Servlet的类似。过滤器的初始化参数即可通过FilterConfig中的getInitParameter方法获取。定义的方式见Filter配置方法的第二种方式
3.Filter配置方法
注解配置:给实现了Filter接口的类添加注解,形式:
其中"urlPatterns"指明为哪一个servlet服务添加过滤器,"/*" 表示全部,即为所有的servlet服务添加此过滤器
在web.xml中进行配置
注解配置和xml文件配制方法的区别:
1) 代码量的显著区别,注解形式配置过滤器简单快捷
2) 注解形式配置过滤器可能会出现问题,因为无法指定过滤器的执行顺序,程序在运行时,前端向后端发送请求收到后,会按照类名的字典顺序依次执行。对于有些过滤器则一定要放在过滤器链的头部,即首要执行的过滤器,例如解决前后交互的跨域问题的过滤器;规定请求和响应的字符集。而对于web.xml配置过滤器会按照 web.xml 从上到下的顺序依次走过需要经过过滤器。
怎么配制过滤器?
对于一些必须首先执行的过滤器按照逻辑顺序在 web.xml 中进行配置,而其他没有严格顺序要求的可以使用注解方式配置过滤器。
4.Filter的使用—设置请求和响应的字符集
编写过滤器
package com.flash.demo.filter;
import javax.servlet.*;
import java.io.IOException;
/**
* 功能描述:设置编码和解码的字符集
*/
@SuppressWarnings({"all"})
public class EncodingFilter implements Filter {
String encod;
String respencod;
// 在xml中定义数据, java代码提取数据可以动态配置一些, xml无需编译, 修改xml文件中的数据, 可以让同一段java代码获得不同的数据
@Override
public void init(FilterConfig filterConfig) throws ServletException {
encod = filterConfig.getInitParameter("encod");// 获取web.xml中定义的数据
respencod = filterConfig.getInitParameter("respencod");
}
// 用来执行过滤操作
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding(encod);// 设置请求解码格式
servletResponse.setContentType(respencod);// 设置响应体内容格式
filterChain.doFilter(servletRequest, servletResponse);// 继续向后执行, 可能是过滤器也可能是servlet服务
}
}
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>Encoding</filter-name>
<filter-class>com.flash.demo.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encod</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>respencod</param-name>
<param-value>text/html;charset=utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>