1、概念
过滤器(filter)是一种代码重用的技术,它可以改变HTTP请求的内容,响应,及Header信息。过滤器通常不产生响应或像Servlet那样对请求作出响应,而是修改或调整到资源的请求,以及来自资源的响应。过滤器可以作用于所有Web资源,即动态或静态内容。
过滤器是指拦截请求,并对传给被请求资源的ServletRequest 或 ServletResponse 进行处理的一个对象。过滤器可以用于登录、加密和解密、会话检查等等。过滤器可以配置为拦截一个或多个资源。如果同一个资源或同一组资源中应用了多个过滤器,则调用顺序有显示显得比较重要,这时候就需要部署描述符(web.xml)来控制其先后顺序。
2、Filter 相关的API
2.1 Filter接口
方法:
- init(FilterConfig filterConfig) 该方法是对filter对象进行初始化的方法,仅在容器初始化filter对象结束后被调用一次。参数FilterConfig可以获得filter的初始化参数(初始化参数参见下面章节)。
- doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 该方法是filter进行过滤操作的方法,是最重要的方法。过滤器实现类必须实现该方法。方法体中可以对request和response进行预处理。其中FilterChain可以将处理后的request和response对象传递到过滤链上的下一个资
- destroy() 该方法在容器销毁过滤器对象前被调用。
2.2 FilterChain接口
该接口类型作为Filter接口中doFilter方法的参数使用。
方法:
- doFilter(ServletRequest request,ServletResponse response) 该方法可以将当前的请求和响应传递到过滤链上的下一个资源,可能是下一个过滤器,也可能是目标资源。
2.3 FilterConfig接口
该接口类型作为Filter接口中的init方法的参数使用。
方法:
- getInitParameter(String name) 该方法用来获得过滤器的初始化参数值。在web.xml中,可以为每一个filter配置需要的初始化参数,与Servlet的类似。过滤器的初始化参数即可通过FilterConfig中的getInitParameter方法获取。
代码案例:
解决中文乱码过滤器:
package com.company.project.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CharacterEncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain)
throws IOException, ServletException {
System.out.println("正在初始化过滤器");
HttpServletRequest request = (HttpServletRequest) arg0;
HttpServletResponse response = (HttpServletResponse) arg1;
if (request.getRequestURI().contains(".css") || request.getRequestURI().contains(".js"))
{
chain.doFilter(request, response);
}
else
{
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
chain.doFilter(request, response);
}
}
}
3、 XML配置过滤器
配置项说明:
<filter>中配置项:
<filter-name>:过滤器的名称
<filter-class>:该过滤器对应的配置类
<init-param>:初始化参数
<param-name>:参数名称
<param-value>:参数值
<filter-mapping>中配置项:
<filter-name>:过滤器名称,和<filter>中的<filter-name>相同
<url-pattern>:过滤器过滤的资源路径
<dispatcher>:指定过滤器过滤的资源的调用方式,默认为REQUEST
dispatcher取值和意义:
- REQUEST:如果资源的调用方式是RequestDispatcher的forward()或include(),那么该资源路径即使匹配,过滤器也不会起作用
- FORWARD:调用方式是RequestDispatcher的forward()起作用
- INCLUDE:调用方式是RequestDispatcher的include()起作用
- ERROR:如果该资源适配异常处理机制调用,则该过滤器起作用
<!-- 配置过滤器对象名称,过滤器类的路径,初始化参数 -->
<filter>
<filter-name>characterFilter</filter-name>
<filter-class>com.company.project.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>author</param-name>
<param-value>86_god</param-value>
</init-param>
</filter>
<!-- 配置过滤器处理的作用域和类型 -->
<filter-mapping>
<filter-name>characterFilter</filter-name>
<url-pattern>*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
获取过滤器初始化参数:
package com.company.project.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CharacterEncodingFilter implements Filter {
private String author;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
//获取初始化参数,使用filterConfig.getInitParameter("filter-name")方法获取
this.author = filterConfig.getInitParameter("author");
System.out.println("author:"+this.author);
}
}
4. 网页错误处理页面
我们的web通常404,500等错误,可能会暴露我们的源码,这是我们不希望让用户看见的,我们可以利用web.xml中配置错误页面来捕捉和处理这种错误页面,让用户看见和谐的页面。


处理方案:
在web.xml文件中配置错误页面,在<web-app></web-app>中间加上如下代码。还需要在location相关的页面的前面加上指令元素<%@page{iserrorPage="true"} %>
<error-page>
<!--exception-type是异常的类型 -->
<!--location是遇到异常应该显示的页面 -->
<exception-type>java.lang.Exception</exception-type>
<location>/error.jsp</location>
</error-page>
<error-page>
<!--error-code是网页异常的代号编码 -->
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
每日心语:
山有山的高度,水有水的深度,没必要攀比,每个人都有自己的长处;风有风的自由,云有云的温柔,没必要模仿,每个人都有自己的个性。你认为快乐的,就去寻找;你认为值得的,就去守候;你认为幸福的,就去珍惜。没有不被评说的事,没有不被猜测的人。做最真实的自己,依心而行,无憾今生。