Filter常见应用

来源:互联网 发布:局域网语音通讯软件 编辑:程序博客网 时间:2024/05/23 00:31

Filter常见应用

l      统一全站字符编码的过滤器

•        通过配置参数encoding指明使用何种字符编码,以处理Html Form请求参数的中文问题

public class CharSetEncodingFilter implements Filter {

 

    private FilterConfig filterConfig;

    public void destroy() {

       // TODO Auto-generatedmethod stub

    }

    private String defaultCharset="utf-8";

    public void doFilter(ServletRequest request, ServletResponseresponse,

           FilterChain chain) throws IOException, ServletException{

       // TODO Auto-generatedmethod stub

      

       //设置请求对象

       HttpServletRequest req=(HttpServletRequest)request;

       HttpServletResponse rep=(HttpServletResponse)response;

   

       String charset=filterConfig.getInitParameter("encoding");//得到初始化参数

       if(charset==null){

           charset=defaultCharset;

           req.setCharacterEncoding(charset);

       }

       request.setCharacterEncoding(charset);

       req.setCharacterEncoding(charset);

      

       rep.setContentType("text/html;charset="+charset);//设置应答内容的类型

      

       chain.doFilter(req, rep);

    }

 

    public void init(FilterConfig filterConfig) throws ServletException {

       // TODO Auto-generatedmethod stub

       this.filterConfig=filterConfig;

    }

}

    <filter>

       <filter-name>CharsetEncodeFilter</filter-name>

    <filter-class>com.hbsi.web.filter.CharSetEncodingFilter</filter-class>

       <init-param>

           <param-name>encode</param-name>

           <param-value>utf-8</param-value>

       </init-param>

    </filter>

 

    <filter-mapping>

       <filter-name>CharsetEncodeFilter</filter-name>

       <url-pattern>/*</url-pattern>

    </filter-mapping>

l      禁止浏览器缓存所有动态页面的过滤器:

•        有 3 个 HTTP 响应头字段都可以禁止浏览器缓存当前页面,它们在 Servlet 中的示例代码如下:

•        response.setDateHeader("Expires",-1);

•        response.setHeader("Cache-Control","no-cache"); 

•        response.setHeader("Pragma","no-cache"); 

•        并不是所有的浏览器都能完全支持上面的三个响应头,因此最好是同时使用上面的三个响应头。

•        Expires数据头:值为GMT时间值,为-1指浏览器不要缓存页面

•        Cache-Control响应头有两个常用值:

•        no-cache指浏览器不要缓存当前页面。

•        max-age:xxx指浏览器缓存页面xxx秒。

public void doFilter(ServletRequest request, ServletResponseresponse,

           FilterChain chain) throws IOException, ServletException{

       // TODO Auto-generatedmethod stub

       HttpServletRequest req=(HttpServletRequest)request;

       HttpServletResponse res=(HttpServletResponse)response;

      

       //让浏览器不缓存页面

       res.setDateHeader("Expires",-1);//将整数值转换为日期类型,-1代表不缓存

       res.setHeader("Cache-Control", "no-cache");

       res.setHeader("Pragma", "no-cache");

       chain.doFilter(req, res);

    }

<servlet-mapping>

       <servlet-name>NoCacheFilter</servlet-name>

       <url-pattern>/servlet/NoCacheFilter</url-pattern>

    </servlet-mapping>

 

    <filter>

       <filter-name>NoCacheFilter</filter-name>

       <filter-class>com.hbsi.web.filter.NoCacheFilter</filter-class>

    </filter>

l      控制浏览器缓存页面中的静态资源的过滤器:

•        场景:有些动态页面中引用了一些图片或css文件以修饰页面效果,这些图片和css文件经常是不变化的,所以为减轻服务器的压力,可以使用filter控制浏览器缓存这些文件,以提升服务器的性能。

public class ExpiresFilter implements Filter {

    public void destroy() {

       // TODO Auto-generatedmethod stub

    }

    public void doFilter(ServletRequest request, ServletResponseresponse,

           FilterChain chain) throws IOException, ServletException{

       // TODO Auto-generatedmethod stub

       HttpServletRequest req=(HttpServletRequest)request;

       HttpServletResponse res=(HttpServletResponse)response;

       //(1)得到请求的是什么资源? js css  jpg

       String uri=req.getRequestURI();

       if(uri.endsWith(".css")){//判断字符串是否是以.css结尾

           //120单位是秒。乘以1000换算成毫秒

           //System.currentTimeMillis()获取的是从1970年1月1日0点0分到现在所经历的毫秒数

           long expiresTime=Integer.parseInt(fileConfig.getInitParameter("css"))*1000;

           //设置页面失效的日期

           res.setDateHeader("Expires", System.currentTimeMillis()+expiresTime);

          

       }else if(uri.endsWith(".js")){

           long expiresTime=Integer.parseInt(fileConfig.getInitParameter("js"))*1000;

           //设置页面失效的日期

           res.setDateHeader("Expires", System.currentTimeMillis()+expiresTime);

       }else if(uri.endsWith(".jpg")){

           long expiresTime=Integer.parseInt(fileConfig.getInitParameter("jpg"))*1000;

           //设置页面失效的日期

           res.setDateHeader("Expires", System.currentTimeMillis()+expiresTime);

       }

        chain.doFilter(req,res);

    }

private FilterConfig fileConfig;

    public void init(FilterConfig filterConfig) throws ServletException {

       // TODO Auto-generatedmethod stub

       this.fileConfig=fileConfig;

    }

}

<filter>

    <filter-name>ExpiresFilter</filter-name>

    <filter-class>com.hbsi.web.filter.ExpiresFilter</filter-class>

    <init-param>

        <param-name>css</param-name>

        <param-value>120</param-value>

    </init-param>

    <init-param>

        <param-name>jsp</param-name>

        <param-value>180</param-value>

    </init-param>

  </filter>

  <filter-mapping>

    <filter-name>ExpiresFilter</filter-name>

    <url-pattern>*.css</url-pattern>

  </filter-mapping>

  <filter-mapping>

    <filter-name>ExpiresFilter</filter-name>

    <url-pattern>*.js</url-pattern>

  </filter-mapping>

  <filter-mapping>

    <filter-name>ExpiresFilter</filter-name>

    <url-pattern>*.jpg</url-pattern>

  </filter-mapping>

原创粉丝点击