Filter拦截器

Filter执行顺序:

GZipFilter应用:

web.xml配置

<filter>
        <filter-name>GzipFilter</filter-name>
        <filter-class>com.citi.icg.portal.compositepageservice.server.filter.GzipFilter</filter-class>
        <init-param>
            <param-name>mimeTypes</param-name>
            <param-value>application/json</param-value>
        </init-param>
    </filter>
    <filter-mapping>
            <filter-name>GzipFilter</filter-name>
            <url-pattern>/mobile/mobile/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
            <filter-name>GzipFilter</filter-name>
            <url-pattern>/page/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
            <filter-name>GzipFilter</filter-name>
            <url-pattern>/portlet/*</url-pattern>
    </filter-mapping>
GzipFilter.java
package com.citi.icg.portal.compositepageservice.server.filter;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.zip.GZIPOutputStream;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

/**
 * Gzip Filter.
 */
public class GzipFilter implements Filter
{
    public void init(FilterConfig cfg) throws ServletException
    {
    }

    public void destroy()
    {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException
    {

        boolean supportsGzip = false;
        @SuppressWarnings("unchecked")
        Enumeration<String> respHeaders = ((HttpServletRequest) req).getHeaders("Accept-Encoding");
        while (respHeaders.hasMoreElements())
        {
            String name = respHeaders.nextElement();
            if (name.matches("(?i).*gzip.*"))
            {
                supportsGzip = true;
                break;
            }
        }

        if (supportsGzip)
        {
            HttpServletResponse httpResp = (HttpServletResponse) resp;
            HttpServletResponseWrapper wrapper = new GzipResponseWrapper(httpResp);
            chain.doFilter(req, wrapper);
            if (!resp.isCommitted())
            {
                wrapper.getOutputStream().close();
            }
        }
        else
        {
            chain.doFilter(req, resp);
        }
    }

    /**
     * Gzip Response Wrapper.
     */
    static class GzipResponseWrapper extends HttpServletResponseWrapper
    {
        private GZIPOutputStream gzipStream;
        private ServletOutputStream servletOutputStream;
        private PrintWriter printWriter;

        GzipResponseWrapper(HttpServletResponse resp) throws IOException
        {
            super(resp);
        }

        @Override
        public ServletOutputStream getOutputStream() throws IOException
        {
            if (servletOutputStream == null)
            {
                servletOutputStream = createOutputStream();
            }
            return servletOutputStream;
        }

        @Override
        public PrintWriter getWriter() throws IOException
        {
            if (printWriter == null)
            {
                printWriter = new PrintWriter(new OutputStreamWriter(getOutputStream(), getCharacterEncoding()))
                {
                    public void write(char[] cb, int off, int len)
                    {
                        super.write(cb, off, len);
                        super.flush();
                    }
                };
            }
            return printWriter;
        }

        private ServletOutputStream createOutputStream() throws IOException
        {
            ServletResponse resp = this.getResponse();
            gzipStream = new GZIPOutputStream(resp.getOutputStream());
            addHeader("Content-Encoding", "gzip");
            return new ServletOutputStream()
            {
                @Override
                public void write(int b) throws IOException
                {
                    gzipStream.write(b);
                }
                @Override
                public void write(byte[] b) throws IOException
                {
                    gzipStream.write(b);
                }
                @Override
                public void write(byte[] b, int off, int len) throws IOException
                {
                    gzipStream.write(b, off, len);
                }

                @Override
                public void flush() throws IOException
                {
                    gzipStream.flush();
                }

                @Override
                public void close() throws IOException
                {
                    gzipStream.close();
                }
            };
        }
    }
}
时间: 2024-10-17 12:47:24

Filter拦截器的相关文章

Jsp的filter拦截器实现用户权限分级

看了一下上学期学的项目,发现用到了jsp的filter来实现不同用户登录网站访问模块的分类,现在把代码分享出来跟大家共享一下··· package com.wws.filter; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import javax.servlet.Filter; import javax.

spring filter拦截器

实现的功能:判断用户是否已登录,未登录用户禁止访问任何页面或action,自动跳转到登录页面.比较好的做法是不管什么人都不能直接访问jsp页面,要访问就通过action,这样就变成了一个实实在在的权限控制了.那么就有3种方法可以解决楼主的问题1,直接使用filter2,直接使用webwork的interceptor,3,将action交给spring管理,使用spring的Aop机制 让用户可以直接访问jsp本来就违反了mvc的本意了1 直接使用filterweb.xml配置 <filter>

【DRP】Filter拦截器-应用

[用法] 1.建立配置文件: 1 package com.bjpowernode.drp.util.filter; 2 3 import java.io.IOException; 4 5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 import javax.servlet.FilterConfig; 8 import javax.servlet.ServletException; 9 import java

SpringBoot------自定义拦截器

1.添加pom.xml使用的依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"&g

过滤器(Filter)和拦截器(Interceptor)

之前总是弄混这两者,今天看了几篇文章,小结一下在这里. Filter介绍 Filter可以认为是Servlet的一种"加强版",它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链.Filter也可以对用户请求生成响应,这一点与Servlet相同,但实际上很少会使用Filter向用户请求生成响应.使用Filter完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行预处理并生成响应,最后Filter再对服务

SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系

一 简介 (1)过滤器: 依赖于servlet容器.在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次.使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码:在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字.危险字符等 关于过滤器的一些用法可以参考我写过的这些文章: 继承HttpServletRequestWrapper以实现在Filter中修改HttpServletReque

基于SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系

一 简介 (1)过滤器: 依赖于servlet容器.在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次.使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码:在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字.危险字符等 关于过滤器的一些用法可以参考我写过的这些文章: 继承HttpServletRequestWrapper以实现在Filter中修改HttpServletReque

Java Filter(拦截器)

多个Filter按照在配置文件中配置的filter顺序执行. 在web.xml文件中配置该Filter,使用init-param元素为该Filter配置参数,init-param可接受如下两个子元素: param-name:指定参数名. param-value:指定参数值. filter .filter-mapping .servlet.servlet-mapping 才构成一个完整的拦截器配置. Filter类需要实现Filter接口,该接口有init.doFilter.destroy3个方法

filter 和 struts 拦截器的区别

观点1: 比较一,filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于java本身的反射机制,这是两者最本质的区别. 比较二,filter是依赖于servlet容器的,即只能在servlet容器中执行,很显然没有servlet容器就无法来回调doFilter方法.而interceptor与servlet容器无关. 比较三,Filter的过滤范围比Interceptor大,Filter除了过滤请求外通过通配符可以保护页面,图片,