蜉蝣ITの博客» Blog Archive » 解决Struts2.1+FckEditer无法上传文件

Struts2是作为JavaWeb领域最为优秀和火热的MVC框架,而FCKEditer也是在线编辑器中的{wz},所以同时使用这两个利器是很多开发者选择。然而整合Struts2和FCKEditer并不像我们想象的那样顺利。一个共性的问题是每当我们上传文件后台就会出现下标越界异常(java.lang.IndexOutOfBoundsException: Index: 0, Size: 0)。 我搜罗了网上的几种解决方案,并简单分析存在的问题,并总结出一个简单合理的{zj2}方案。

一、部署包含FCKEditer的Struts2的应用

我们假设你已经知道如何创建一个包含FCKEditer的Struts2应用,可以无视这一段。 具体的方法不再赘述,你的应用配置看起来应该像这样子(Struts2.1+FCKEditer-java2.6):

    <!-- 配置struts2过滤器  -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
	<!-- 配置FCKEditer的Servlet  -->
  	<servlet>
		<servlet-name>ConnectorServlet</servlet-name>
		<servlet-class>
			net.fckeditor.connector.ConnectorServlet
		</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>ConnectorServlet</servlet-name>
		<!-- Do not wrap this line otherwise Glassfish will fail to load this file -->
		<url-pattern>/fckeditor/editor/filemanager/connectors/*</url-pattern>
	</servlet-mapping>

二、问题描述与分析

部署,启动,运行,访问,貌似编辑器没什么问题。但是上传图片时问题出现了,图片传不上去,同时后台出现异常(java.lang.IndexOutOfBoundsException: Index: 0, Size: 0)。

但是我们xx是按照FCKEditer-javaDEMO配置的,而且在没有Struts2的环境中是xx正常的,所以我们初步推断出产生这个问题的原因。

由于struts2对所有的请求进行过滤,对HttpServletRequest进行了封装,FCKEditer已经无法拿到原来的HttpServletRequest,所以当FCKEditerrequest.getinputStream的时候就会出错!

三、网上解决方案分析

网上主要有三种解决方案,都有不同的问题。如果你只想解决问题,可以直接看。

  1. 修改Web.xml ? ? 原文链接:?
  2. 自定义Filter(修改Struts2源代码) ? 原文链接:
  3. 自定义Filter(继承-覆写) ? 原文链接:

方案一存在的问题:

对于没有.action后缀的应用无效
在struts2.1中会报错
可能会留下一些隐患

方案二存在的问题

需要struts2的源代码
该拦截器的代码不能持续和应用中struts2版本同步
修改源代码是不被建议的做法

方案三存在的问题

if(“/fckeditor/editor/filemanager/connectors/fileupload”.equals(request.getRequestURI()))不正确
request.getRequestURI() 取到的值为形如 /应用名/fckeditor/editor/filemanager/connectors/php/upload.php的字符串
应该改为if (“/fckeditor/editor/filemanager/connectors”.equals(request.getServletPath()))

四、最简单的解决方案


综合几个方案,我们可以这样解决:

1、 新建一个Java类,继承自StrutsPrepareAndExecuteFilter类,如com.fuyouit.filter.FckPassFilter

2、 覆写StrutsPrepareAndExecuteFilter的doFilter方法

	@Override
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		if ("/fckeditor/editor/filemanager/connectors".equals(request.getServletPath()))
		{
			chain.doFilter(req, res);
		}
		else
		{
			super.doFilter(req, res, chain);
		}
	}

3在Web.xml中配置将Struts的过滤器替换为该过滤器,修改完后配置如下

    <!-- 配置struts2过滤器  -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>com.fuyouit.blog.util.FckPassFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

	<!-- 配置FCKEditer的Servlet  -->
  	<servlet>
		<servlet-name>ConnectorServlet</servlet-name>
		<servlet-class>
			net.fckeditor.connector.ConnectorServlet
		</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>ConnectorServlet</servlet-name>
		<!-- Do not wrap this line otherwise Glassfish will fail to load this file -->
		<url-pattern>/fckeditor/editor/filemanager/connectors/*</url-pattern>
	</servlet-mapping>

4、享受成功整合Struts2和FCKEditer的喜悦

  • 暂无相关日志
郑重声明:资讯 【蜉蝣ITの博客» Blog Archive » 解决Struts2.1+FckEditer无法上传文件】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——