Filter映射
1、使用通配符“*”拦截用户的所有请求
Filter E <1n心—西5田-尔N"配直习滤器拦截的资源信息,如果想让过滤器拦截所的请求访问,那么需要使用通配“**”
2、拦截不同方式的访问请求
在web.xml文件中,一(个ilter-mapping>元素用于配置一个Fller 所负责拦数的资源。元素中有一个特殊的子元素
当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问的,那么该过滤器将不会被调用。
2 ) INCLUDE
如果目标资源是通过RequestDispatcher的include()方法访问的,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
3 ) FORWARD
如果目标资源是通过RequsDispatcler的foward)方法访问的,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
4) ERROR !
如果目标资源是通过声明式异常处理机制调用的,那么该过滤器将被调用。除此之外,过滤器不会被调用。
为了更好地理解上述4个值的作用,接下来以FORWARD为例,分步骤演示Filter对转发请求的拦截效果。
2)为了防止其他过滤器影响此次Fller 链的演示效果,请先在web xml文件中注释掉其他过滤器的配置信息。
然后,将MyFilter01和MyFilter02过滤器的映射信息配置在MyServlet配置信息前面
package cn.itcast.chapter08.filter;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
public class myFilter3 implements Filter {
private String characterEncoding ;
FilterConfig fc;
public void init(FilterConfig fConfig) throws ServletException {
//获取FilterConfig对票
this.fc = fConfig;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException【参数信息
characterEncoding=fc.getInitParameter("encoding");
System.out.printin("encoding初始化费数的值为:"+characterEncoding);
chain.doFilter(request, response);
}
public void destroy() {
}
}
创建过滤器
在chapter08 项目的cn.itcast.chapter08.filter 包中,编写一个CharacterFiter 类,CharacterFilter类用于拦截用户的请求访问,实现统一全站编码的功能。只是针对请求的方式不同,解决乱码的方式也不相同。其中,POST方式的请求参数存放在消息体中,可以通过setCharacterEncoding()方法进行设置;而GET方式的请求参数存放在消息头中,必须得通过获取UBr参数才能进行设置。如果每次单独对GET请求方式进行处理,势必会很麻烦。为此,可以通过HtpSeretRequestrapper类对HtSereletRequeset类进行包装,通过重写get Paramel()的方式来设置GET方式提交参数的编码
package cn.itcast.chapter08.filter;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class CharacterFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
// 拦截所有的请求 解决全站中文乱码
// 指定 request 和 response 的编码
request.setCharacterEncoding("utf-8"); // 只对消息体有效
response.setContentType("text/html;charset=utf-8");
// 对request进行包装
CharacterRequest characterRequest = new CharacterRequest(request);
chain.doFilter(characterRequest, response);
}
public void destroy() {
}
}
// 继承 默认包装类HttpServletRequestWrapper
class CharacterRequest extends HttpServletRequestWrapper {
private HttpServletRequest request;
public CharacterRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
// 子类继承父类一定会覆写一些方法,此处用于重写getParamter()方法
public String getParameter(String name) {
// 调用被包装对象的getParameter()方法,获得请求参数
String value = super.getParameter(name);
if (value == null)
return null;
// 判断请求方式
String method = super.getMethod();
if ("get".equalsIgnoreCase(method)) {
try {
value = new String(value.getBytes("iso-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
// 解决乱码后返回结果
return value;
}
}
配置映射信息
在web.xml文件中,配置CharacterServlet和CharacterFilter的映射信息。由于要拦截用户访问资源的所有请求,因此,将CharacterFilter映射信息中元素拦截的路径设置为“/*
CharacterServlet CharacterServlet cn.itcast.chapter08.filter.CharacterServlet CharacterServlet /CharacterServlet CharacterFilter cn.itcast.chapter08.filter.CharacterFilter CharacterFilter /*



