`
xxqn
  • 浏览: 74923 次
  • 性别: Icon_minigender_1
  • 来自: 广东韶关
社区版块
存档分类
最新评论

GZIP没有对/seam/resource/*进行压缩

阅读更多
就算你在容器里面设置了gzip,也不能对/seam/resource/*进行压缩,需要使用拦截器才能实现压缩,同时也发现在ie5.x下对/seam/resource/*进行压缩,解压后js文件有错,这应该是IE的问题。以下是我所使用的代码:
public class GzipSeamResourceServlet implements Filter {
	
	public static final String gzip="gzip";
	public static final String transferEncoding = "transferEncoding";
	
	public void init(FilterConfig filterConfig) {
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		
		HttpServletRequest httpRequest = (HttpServletRequest) request;

		HttpSession session = httpRequest.getSession();
		
		if (session.getAttribute(gzip) == null) {
			
			final String gzipStr = getGZIPEncoding((HttpServletRequest) request);
			if(gzipStr!=null){
				session.setAttribute(transferEncoding,gzipStr );
				session.setAttribute(gzip,true );
				String s = ((HttpServletRequest)request).getHeader("user-agent") ;
				if((s.indexOf("MSIE 5.")+s.indexOf("MSIE 4.")+s.indexOf("MSIE 3."))>0){
					session.setAttribute(gzip,false );
					YcEJB_INFO.logger.info("浏览器信息为:"+s);
				}
			}else{
				session.setAttribute(gzip,false );
			}
		}
		

		if ((Boolean)session.getAttribute(gzip) ) {
			HttpServletResponse hsr=((HttpServletResponse) response);
			hsr.setHeader("Content-Encoding", (String)session.getAttribute(transferEncoding));
			GZIPEncodableResponse wrappedResponse = new GZIPEncodableResponse(hsr);
			chain.doFilter(request, wrappedResponse);
			wrappedResponse.flush();
		} else {
			chain.doFilter(request, response);

		}
	}

	public void destroy() {
	}

	private static String getGZIPEncoding(HttpServletRequest request) {
		String acceptEncoding = request.getHeader("Accept-Encoding");
		if (acceptEncoding == null)
			return null;
		acceptEncoding = acceptEncoding.toLowerCase();
		if (acceptEncoding.indexOf("x-gzip") >= 0) {
			return "x-gzip";
		}
		if (acceptEncoding.indexOf("gzip") >= 0) {
			return "gzip";
		}
		return null;
	}

	private class GZIPEncodableResponse extends HttpServletResponseWrapper {
		private GZIPServletStream wrappedOut;

		public GZIPEncodableResponse(HttpServletResponse response) throws IOException {
			super(response);
			wrappedOut = new GZIPServletStream(response.getOutputStream());
		}

		public ServletOutputStream getOutputStream() throws IOException {
			return wrappedOut;
		}

		private PrintWriter wrappedWriter;

		public PrintWriter getWriter() throws IOException {
			if (wrappedWriter == null) {
				wrappedWriter = new PrintWriter(new OutputStreamWriter(getOutputStream(), getCharacterEncoding()));
			}
			return wrappedWriter;
		}

		public void flush() throws IOException {
			if (wrappedWriter != null) {
				wrappedWriter.flush();
			}
			wrappedOut.finish();
		}
	}

	private class GZIPServletStream extends ServletOutputStream {
		private GZIPOutputStream outputStream;

		public GZIPServletStream(OutputStream source) throws IOException {
			outputStream = new GZIPOutputStream(source);
		}

		public void finish() throws IOException {
			outputStream.finish();
		}

		public void write(byte[] buf) throws IOException {
			outputStream.write(buf);
		}

		public void write(byte[] buf, int off, int len) throws IOException {
			outputStream.write(buf, off, len);
		}

		public void write(int c) throws IOException {
			outputStream.write(c);
		}

		public void flush() throws IOException {
			outputStream.flush();
		}

		public void close() throws IOException {
			outputStream.close();
		}
	}

}


web.ini增加
	<filter>
		<filter-name>GZIPEncoder</filter-name>
		<filter-class>filters.GzipSeamResourceServlet</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>GZIPEncoder</filter-name>
		<url-pattern>/seam/resource/*</url-pattern>
	</filter-mapping>
分享到:
评论

相关推荐

    jbossseam eclipse安装 例子学习.doc

    3. **JBoss Seam** - **下载地址**:[www.seamframework.org/Download](http://www.seamframework.org/Download) - **推荐版本**:2.1.1 GA - **下载文件**:jboss-seam-2.1.1.GA.zip 4. **JBoss Tools** - *...

    seam-javapolis2007

    - **欧洲的隐喻**:Seam 类比于欧洲,由多个参与者组成,包括 EJB、JAAS、JBoss Rules、Ajax、jBPM 等技术,虽然它们可以独立工作,但通过 Seam 可以更好地进行集成。 - **历史**:Seam 的发展历程,从 2002 年 ...

    Jboss seam2.1版本开发参考文档

    **JBoss Seam** 是一个企业级Java Web应用框架,它简化了基于Java平台的应用程序开发过程。该框架提供了强大的上下文管理功能、会话管理、组件模型以及集成其他技术(如Hibernate和jBPM)的能力。Seam的目标是减少...

    SEAM 中文开发指南

    - **SEAM**:SEAM 是一个基于 Java EE 的企业级应用框架,它简化了复杂的应用程序开发过程,并且提供了丰富的功能来支持业务逻辑的实现。 - **版本信息**:本文档介绍了 SEAM 2.0 GA 版本的功能特性及其使用方法。 ...

    JBOSS SEAM组件中文手册

    1. **Faces Context增强**: 在Seam 2.0中,对JSF的Faces Context进行了扩展,提供了更多的上下文信息和操作。 2. **CDI支持**: 虽然Seam 2.0发布时,Contexts and Dependency Injection (CDI)规范还未正式发布,但...

    jboss seam 2.01GA REF DOC

    ### JBoss Seam 2.01GA REF DOC #### 引言:JBoss Seam概览与功能介绍 JBoss Seam 是一个为简化企业级 Java 应用开发而...以上是对 JBoss Seam 2.01GA REF DOC 的详细解读,希望对您理解和掌握 JBoss Seam 有所帮助。

    Beginning JSF2 APIs and JBoss Seam

    结合JSF2与JBoss Seam** - **互补性**:JSF2提供了丰富的组件库和强大的视图管理功能,而Seam则加强了组件之间的交互和会话管理。两者的结合可以显著提升开发效率和应用质量。 - **最佳实践**:例如,在开发复杂的...

    seam_reference.pdf

    - **组件模型特点**:在Seam框架中,没有明确区分表示层组件和业务逻辑组件。这意味着开发人员可以根据自己的需求和架构设计来构建应用,而不必受限于特定框架所强制实施的分层方案。 #### 二、Seam组件及其上下文 ...

    seam_in_action

    - **生命周期管理**:Seam 对应用程序的生命周期进行了细致的管理和控制,支持多种不同的生命周期模式,如对话式、会话式等。 - **绝对控制反转**:Seam 引入了绝对控制反转(Absolute Inversion of Control, AIOC)...

    seam参考手册中文版

    - **Seam**是JBoss家族中的一员,它是一个建立于Java EE平台之上的开源框架,旨在简化企业级应用的开发过程。 - **版本**: 本手册介绍的是Seam 2.0 GA版本。 ##### Seam的特点 - **上下文相关的组件模型**:这是...

    Manning Seam in Action 2008

    **第一部分:准备使用Seam** - **第1章:Seam统一了Java EE 3**(P1) - 介绍Seam如何整合Java EE 3标准中的技术,如JSF、EJB 3等。 - 讲解Seam如何简化企业级应用开发流程。 - **第2章:将Seam组件投入使用**...

    seam+in+action+中文版

    **JBoss Seam** 是一个基于 **Java EE** 的框架,它主要用于简化企业级应用的开发。Seam 通过提供一系列的功能模块和服务,使得开发者能够更加专注于业务逻辑而非底层的技术细节。在了解Seam 项目结构时,主要关注...

    服装行业生产术语中英文翻译.pdf

    30. **FITTING / 试身**:在生产过程中对服装进行试穿,检查合身度和舒适度。 31. **FIVE THREADS OVERLOCK MACHINE / 5线及骨车**:一种能同时缝合和包边的五线缝纫机。 32. **FLAT SEAM / 平缝**:一种简单的...

    Seam_Reference_Guide.pdf

    - **重命名项目和文件夹**:为了保持项目结构的清晰性和可维护性,有时需要对项目名称或文件夹进行重命名。这部分内容提供了实现这一操作的具体步骤。 #### 4. Seam菜单和动作 - **文件菜单动作**:Seam Dev Tools...

    seam in action

    - **生命周期管理**:Seam对组件的生命周期进行了细致的管理和控制,包括初始化、渲染、事件处理等多个阶段。 #### 四、Seam框架的关键组成部分 1. **Seam生命周期** - **概念介绍**:Seam生命周期是指Seam组件从...

    为Seam做好准备

    "为Seam做好准备"这个标题暗示我们即将探讨的是关于Seam框架的入门与准备工作。Seam是一个Java EE集成框架,它将JavaServer Faces(JSF)、Java Persistence API(JPA)、Enterprise JavaBeans(EJB)3.0以及其他...

    jboss seam 教程

    - **Seam**:一个基于Java EE平台的应用框架,旨在简化企业级应用开发。 - **JBoss Seam**:由JBoss提供的Seam实现,提供了一系列功能强大的工具和服务,帮助开发者快速构建复杂的Web应用。 - **本教程**:主要介绍...

    JBoss Seam: Simplicity and Power Beyond Java EE

    **JBoss Seam** 是一款强大的开源框架,它在**Java EE** 的基础上提供了更为简单且功能强大的开发方式,旨在简化企业级应用的开发过程。Seam 的核心优势在于其对状态管理、会话管理、集成数据模型与表现层以及业务...

Global site tag (gtag.js) - Google Analytics