zoukankan      html  css  js  c++  java
  • 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资源被访问。

  • 相关阅读:
    公钥,私钥和数字签名这样最好理解
    SolrCloud的官方配置方式
    由于Windows和Linux行尾标识引起脚本无法运行的解决
    python模块名和文件名冲突解决
    Linux下编译安装python3
    Storm集群的安装配置
    Linux下编译安装Apache 2.4
    SELinux的关闭与开启
    Spring MVC配置静态资源的正常访问
    SolrCloud环境配置
  • 原文地址:https://www.cnblogs.com/HelloM/p/14218717.html
Copyright © 2011-2022 走看看