`
gogo1217
  • 浏览: 152099 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Struts2 过滤器处理静态资源的若干bug

    博客分类:
  • Java
阅读更多

版权所有,转载请注明来源http://gogo1217.iteye.com,违者必究!   

 

Struts2是一个优秀的MVC框架,在使用中发现struts2的过滤器在处理静态资源的一些问题,现与大家分享解决办法。

 

问题1: struts2的过滤器转发静态资源等待时间超长

    最近在使用ext4.1,ext-all.js可不是一般的大,达到了1.2M,在使用struts2的过滤器转发静态资源的时候,发现巨慢无比,但是如果使用ext的Loader动态加载,减小单个文件的大小,则不会出现这样的情况,

    初步判断是struts2过滤器的在处理静态资源文件过大的时候出现了问题。

 

通过firebug查看网络请求,对比使用struts2过滤器和未使用struts2过滤器的情况。

1、通过struts2的过滤器的请求,响应头消息中没有设置Content-Length,文件大小为0,加载完成时间达到了1-2m。

 

2、未通过struts2的过滤器转发,响应头消息中Content-Length设置为1264053,文件的大小为1.2M,加载时间在1-2s完成。

 

 

通过分析struts2过滤器的源码,发现默认是使用org.apache.struts2.dispatcher.DefaultStaticContentLoader处理的静态资源。在整个DefaultStaticContentLoader类中,未发现设置Content-Length的代码。

修改思路:在往response中写入数据之前,预先读取文件的大小,写入response中。当然我们可以自己继承该类,对该方法进行覆写。然后将自定义的类配置在struts2的过滤器中,具体代码如下:

 

 public void findStaticResource(String path, HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        String name = cleanupPath(path);
        for (String pathPrefix : pathPrefixes) {
            URL resourceUrl = findResource(buildPath(name, pathPrefix));
            if (resourceUrl != null) {
                InputStream is = null;
                try {
                    //check that the resource path is under the pathPrefix path
                    String pathEnding = buildPath(name, pathPrefix);
                    if (resourceUrl.getFile().endsWith(pathEnding)){
                    	is = resourceUrl.openStream();
                    }
                } catch (IOException ex) {
                    continue;
                }

                //not inside the try block, as this could throw IOExceptions also
                if (is != null) {
                	//此处为新增代码
                	String fileName=resourceUrl.getPath();
                	String realFileName=fileName.replaceAll("\\%20", " ");//由于路径是URL方式,需要对路径进行替换编码
                	if(fileName.indexOf("file:/")>-1){
                		realFileName=realFileName.substring(fileName.indexOf("file:/")+6);
                	}
                	if(realFileName.startsWith("/")){
                		realFileName=realFileName.substring(1);
                	}
                	if(fileName.indexOf(".jar!/")>0){//如果来源是jar包
                		String[] paths=realFileName.split("!/");
                		JarEntry file=new JarFile(paths[0]).getJarEntry(paths[1]);
                		response.setContentLength((int) file.getSize());
                	}else{//否则是classes目录下
                		File file=new File(realFileName);
                		response.setContentLength((int) file.length());
                	}
                	//新增代码结束
                	
                    process(is, path, request, response);
                    return;
                }
            }
        }

        response.sendError(HttpServletResponse.SC_NOT_FOUND);
    }

 

 

问题2:某些静态资源文件经过struts2过滤器后不能正常加载,如ie特有的.htc文件经过过滤器后不能正常使用。

      我们知道通过csshover3.htc的加载,能解决ie低版本不能相应css :hover 等一些兼容性问题。但是经过struts2过滤器后,则不能正常加载,经过ie的开发者工具查看,发现contentType未正常设置,可通过修改 org.apache.struts2.dispatcher.DefaultStaticContentLoader的下面方法解决。

当然我们可以自己集成该类,对该方法进行覆写。然后将自定义的类配置在struts2的过滤器中,

    /**
     * Determine the content type for the resource name.
     *
     * @param name The resource name
     * @return The mime type
     */
    protected String getContentType(String name) {
        // NOT using the code provided activation.jar to avoid adding yet another dependency
        // this is generally OK, since these are the main files we server up
        if (name.endsWith(".js")) {
            return "text/javascript";
        } else if (name.endsWith(".css")) {
            return "text/css";
        } else if (name.endsWith(".html")) {
            return "text/html";
        } else if (name.endsWith(".txt")) {
            return "text/plain";
        } else if (name.endsWith(".gif")) {
            return "image/gif";
        } else if (name.endsWith(".jpg") || name.endsWith(".jpeg")) {
            return "image/jpeg";
        } else if (name.endsWith(".png")) {
            return "image/png";
          //新增处理.htc文件
        }else if(name.endsWith(".htc")){
        	return "text/x-component";
        }else {
            return null;
        }
    }
  • 大小: 13.3 KB
  • 大小: 13.1 KB
分享到:
评论

相关推荐

    struts2配置过滤器

    最后,通过`<filter-mapping>`元素指定了哪些URL路径需要被此过滤器处理。 ##### 2.2 SessionCheckFilter实现分析 接下来分析`SessionCheckFilter`的具体实现细节: ```java package com.accp.util; import java...

    Struts 2 过滤器的总结

    Struts 2框架中的过滤器(Filter)是Servlet规范的一部分,主要用于在请求到达目标资源(如JSP、Servlet或其他资源)之前或响应返回客户端之前进行预处理或后处理。过滤器能够检查和修改`ServletRequest`和`Servlet...

    Struts权限过滤器

    过滤器会按照声明的顺序依次执行,当一个请求到达时,过滤器链中的每个过滤器都会有机会检查并处理这个请求。如果某个过滤器决定阻止请求,那么它将不会传递给下一个过滤器,从而实现权限控制。 2. **配置过滤器**...

    struts核心过滤器FilterDispatcher介绍

    struts核心过滤器FilterDispatcher介绍,struts核心过滤器FilterDispatcher介绍

    struts2实例 自定义过滤器 文件上传下载 登录功能

    在Struts2中,过滤器(Filter)是Servlet API的一部分,用于拦截请求并在请求到达目标资源之前进行处理。自定义过滤器允许开发者根据需求添加特定的处理逻辑,如权限验证、日志记录或内容修改。创建自定义过滤器需...

    struts2配置静态资源代码详解

    在Struts2中,配置静态资源是为了确保像CSS、JavaScript、图片等非Action处理的资源能够正常被浏览器访问。这些资源通常不涉及业务逻辑,而是用于页面展示和交互。配置静态资源对于优化应用性能和提升用户体验至关...

    struts2.0字符编码使用过滤器

    每个过滤器有机会修改请求和响应,直到请求达到最终的目标资源(如Struts2的Action)。在响应返回给客户端之前,过滤器链会逆序执行,再次有机会处理响应。 7. **i18n国际化** 文件名"i18n"可能指的是国际化...

    过滤器 Struts2全局变量 action转化do

    标题中的“过滤器 Struts2全局变量 action转化do”可能指的是Struts2框架中的ActionMapping和FilterDispatcher配置,以及全局结果(Global Results)的概念。 1. **过滤器(Filter)**:在Java Web开发中,过滤器是...

    简单理解Struts2中拦截器与过滤器的区别及执行顺序

    Struts2 中的拦截器(Interceptor)和过滤器(Filter)是两个不同的概念,虽然它们都可以影响请求的处理过程,但它们的作用域、执行顺序和实现机制都有所不同。 拦截器(Interceptor) 拦截器是 Struts2 框架中的...

    struts2过滤器代码

    页面开发时经常会出现中文乱码问题,需要我们对编码进行转换。手工转换很麻烦,写个过滤器就好多了。

    Struts2编写的通用(拦截器,过滤器)Filter

    这个名为"Struts2编写的通用(拦截器,过滤器)Filter"的项目,主要目标是防止用户非法访问未授权的页面,确保只有登录用户才能访问特定的资源。 **拦截器(Interceptor)** 拦截器是Struts2框架的核心特性之一,它...

    struts2技巧,笔记.zip指定404,500页面 utf-8过滤器 防SQL注入 解决乱码

    Struts2提供了一个名为`ActionContextCleanUp`的过滤器,它负责清理ActionContext,确保请求处理过程中使用的字符集是UTF-8。在web.xml中添加此过滤器并配置为全局过滤器,可以确保所有请求都使用UTF-8编码,避免...

    tomcat、struts2、servlet Filter(过滤器) 工作原理

    Servlet Filter(过滤器)是Servlet API的一部分,它允许开发者在请求被Servlet处理之前或之后对请求和响应进行拦截和修改。Filter可以用来实现如登录验证、字符编码转换、日志记录等多种功能。当一个请求到达Web...

    Struts2拦截器实现权限控制demo

    在Struts2中,拦截器是实现业务逻辑控制和增强功能的重要机制,它们扮演着类似于AOP(面向切面编程)的角色,允许在动作执行前后插入自定义逻辑。在这个“Struts2拦截器实现权限控制demo”中,我们将深入探讨如何...

    struts 常用过滤器

    中文乱码问题很头疼,但一个好的过滤器就可以解决问题啦

    结合struts2编写的通用过滤器filter

    本示例中的“通用过滤器filter”是专门为Struts2设计的,用于增强应用的安全性和功能性。 过滤器(Filter)在Java Servlet规范中定义,是基于请求/响应模型工作的。它们通过实现`javax.servlet.Filter`接口,并重写...

    struts2用cookie实现自动登录中用过滤器执行读取上下文方法

    在Web应用的`web.xml`配置文件中,我们需要将这个过滤器添加到Struts2的过滤器链之前,确保它能在处理请求前先运行: ```xml <filter-name>AutoLoginFilter <filter-class>...

    Struts2整合Freemarker生成静态页面

    2. **配置Struts2**:在Struts2的配置文件(通常为struts.xml)中,我们需要配置Freemarker作为视图解析器。通过添加`<constant name="struts.action.extension" value="html"/>`,让Struts2将Action的结果映射到....

    Struts2静态页面生成

    Struts2是一个非常流行的Java Web框架,用于构建企业级的MVC(模型-视图-控制器)应用程序。在Web开发中,静态页面通常用于展示不经常变动的信息,如公司介绍、帮助文档等,它们对性能优化和SEO友好。Struts2结合...

    静态资源、struts2、Hibernate、Spring、js核心jar包

    这里提到的“静态资源、Struts2、Hibernate、Spring、js核心jar包”涵盖了Web开发中的几个关键组件。让我们逐一深入探讨它们的重要性及如何在项目中运用。 1. 静态资源: 静态资源主要包括HTML、CSS、JavaScript...

Global site tag (gtag.js) - Google Analytics