一· 问题描述与分析
部署,启动,运行,访问,貌似编辑器没什么问题。但是上传图片时问题出现了,图片传不上去,同时后台出现异常(java.lang.IndexOutOfBoundsException: Index: 0, Size: 0)。
但是我们完全是按照FCKEditer-java的DEMO配置的,而且在没有Struts2的环境中是完全正常的,所以我们初步推断出产生这个问题的原因。
由于struts2对所有的请求进行过滤,对HttpServletRequest进行了封装,FCKEditer已经无法拿到原来的HttpServletRequest,所以当FCKEditer的request.getinputStream的时候就会出错!
二·网上解决方案分析
网上主要有三种解决方案,都有不同的问题。如果你只想解决问题,可以直接看第四。
- 修改Web.xml 原文链接: http://www.javaeye.com/topic/150989
- 自定义Filter(修改Struts2源代码) 原文链接:http://hi.baidu.com/hsazj/blog/item/33f032119404251bb9127b89.html
- 自定义Filter(继承-覆写) 原文链接:http://www.po-soft.com/blog/yongtree/566.html
方案一存在的问题:
对于没有.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);
}
}
再到web.xml中修改struts2拦截器
<servlet-mapping>
<servlet-name>Connector</servlet-name>
<url-pattern>
/fckeditor/editor/filemanager/connectors/*
</url-pattern>
</servlet-mapping>

被折叠的 条评论
为什么被折叠?



