Filter专题

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资源被访问。

原文地址:https://www.cnblogs.com/HelloM/p/14218717.html