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.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; /** * @ClassName: CharacterEncodingFilter * @Description: 此过滤器用来解决全站中文乱码问题 */ public class CharacterEncodingFilter implements Filter { private FilterConfig filterConfig = null; //设置默认的字符编码 private String defaultCharset = "UTF-8"; //过滤器方法 doFilter public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp;
//这里是获取xml过滤器配置的参数 String charset = filterConfig.getInitParameter("charset"); if(charset==null){ charset = defaultCharset; } request.setCharacterEncoding(charset); response.setCharacterEncoding(charset);
//给返回的页面设置字符编码 response.setContentType("text/html;charset="+charset); MyCharacterEncodingRequest requestWrapper = new MyCharacterEncodingRequest(request);
// chain对象 会向继续寻找是否有filter 如果有则执行下一层的filter 没有就直接执行servlet的service方法 chain.doFilter(requestWrapper, response); } public void init(FilterConfig filterConfig) throws ServletException { //得到过滤器的初始化配置信息 this.filterConfig = filterConfig; } public void destroy() { } } /* 1.实现与被增强对象相同的接口 2、定义一个变量记住被增强对象 3、定义一个构造器,接收被增强对象 4、覆盖需要增强的方法 5、对于不想增强的方法,直接调用被增强对象(目标对象)的方法 */ class MyCharacterEncodingRequest extends HttpServletRequestWrapper{ private HttpServletRequest request; public MyCharacterEncodingRequest(HttpServletRequest request) { super(request); this.request = request; } /* 重写getParameter方法 * @see javax.servlet.ServletRequestWrapper#getParameter(java.lang.String) */
//获取传入的参数
@Override public String getParameter(String name) { try{ //获取参数的值 String value= this.request.getParameter(name); if(value==null){ return null; } //如果不是以get方式提交数据的,就直接返回获取到的值 if(!this.request.getMethod().equalsIgnoreCase("get")) { return value; }else{ //如果是以get方式提交数据的,就对获取到的值进行转码处理 以国标码进行解读 utf8输出 value = new String(value.getBytes("ISO8859-1"),this.request.getCharacterEncoding()); return value; } }catch (Exception e) { throw new RuntimeException(e); } } }
web.xml配置
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>filter.CharacterEncodingFilter</filter-class> <!--过滤器类--> <init-param>
<!--参数名--> <param-name>charset</param-name> <param-value>UTF-8</param-value> </init-param> </filter>
<!--拦截所有请求--> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Filter
作用:拦截Jsp,servlet,静态图片文件或静态html文件资源,从而实现一些特殊的功能。例如:权限访问控制、敏感词汇过滤,压缩响应信息。
示意图
Filter的工作流程
对发送的请求进行拦截,会先调用filter中的doFilter方法,调用目标资源,同时传递一个filterChain对象,他也提供了一个doFilter方法,可以根据需求,如果还有拦截器就继续调用doFilter,如果是最后一层拦截器,就直接调用web资源的service方法。web资源被访问。