首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

struts2 FCKeditor不能上传图片的有关问题解决

2012-06-28 
struts2 FCKeditor不能上传图片的问题解决前提是,FCKeditor已经整合到你的Web项目中,FCKeditor已经可以使

struts2 FCKeditor不能上传图片的问题解决
前提是,FCKeditor已经整合到你的Web项目中,FCKeditor已经可以使用,但就是在上传图片的时候一直停住不动,如下图。如果FCKeditor单纯地在jsp页面上显示,不会存在这样的问题。但是如果FCKeditor与Struts整合,就会出现这样的问题。造成此问题的原因就是Struts的拦截器,在web.xml配置文件中,可以清楚的看到:

view plain   copy<filter-mapping>     <filter-name>struts2</filter-name>     <url-pattern>/*</url-pattern> </filter-mapping>  就是上面这个配置,Struts会拦截所以以“/”开头的URL。

关于将FCKeditor整合到Web项目中,可以参考《Java FckEditor 2.6+JSP的配置方法详解》。

在FCKeditor的配置中,FCKeditor是使用servlet来实现的,它也是通过拦截URL的机制进行工作的,FCKeditor的部分servlet配置如下:

view plain   copy<servlet-mapping>    <servlet-name>Connector</servlet-name>    <url-pattern>/fckeditor/editor/filemanager/connectors/*</url-pattern> </servlet-mapping> 现在就很明了了,struts拦截所有以“/”开头的URL,FCKeditor的servlet拦截所有以“/fckeditor/editor/filemanager/connectors/”开头的URL,当你使用FCKeditor上传图片的时候,URL中包含有“/”(指网站根目录),优先被struts的拦截器拦截,这样上传图片的URL请求自然就不会转发到FCKeditor的servlet,所以我们上传图片也就不成功。

网上有很多解决方法,但多数是修改struts的拦截范围,如将"/*"改成"*.do"或"*.action"之类的。这不是一个好方法,因为在我的项目中,我没有使用do或action的URL扩展,这样显然不能解决我的问题,那么有没有一个更加完美的解决方法呢?

答案是肯定的。我自己定义了一个过滤器FCKFilter.java,让它继承Struts2的过滤器StrutsPrepareAndExecuteFilter,完整代码如下:
package com.olympus.sapg.smtinnovation.util.method;

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;

public class FCKFilter extends StrutsPrepareAndExecuteFilter {
    public void doFilter(ServletRequest req,ServletResponse res, FilterChain chain) throws IOException, ServletException {  
        HttpServletRequest request = (HttpServletRequest) req; 
        String URI = request.getRequestURI();
        String[] uriArray = URI.split("/fckeditor/editor/filemanager/connectors/");
        int arrayLen = uriArray.length;
        if (arrayLen >= 2) {
            chain.doFilter(req, res); 
        }else {
            super.doFilter(req, res, chain);  
        }
    } 
}


上面的代码是重写了Struts2的过滤器StrutsPrepareAndExecuteFilter中的doFilter方法,执行的原理为:

获得完整的http url地址,然后判断url地址中是否包含有FCKeditor的servlet拦截规则“/fckeditor/editor/filemanager/connectors/”,若包含,struts就不拦截该url请求,而是直接转发,交由FCKeditor的servlet来处理;若不包含,则拦截该url请求,由struts来处理。

自定义的过滤器写完之后,要在web.xml中更改struts的拦截器类,不能再使用struts的默认拦截器类StrutsPrepareAndExecuteFilter。但是请放心,自定义的过滤器FCKFilter继承了StrutsPrepareAndExecuteFilter里的所有的方法,因此项目依然照常运行。

view plain   copy<!-- struts2 --> <filter>      <filter-name>struts2</filter-name>     <filter-class>com.olympus.sapg.smtinnovation.util.method.FCKFilter</filter-class>     <init-param>         <param-name>actionPackages</param-name>         <param-value>com.olympus.sapg.smtinnovation.action</param-value>     </init-param> </filter>  <filter-mapping>     <filter-name>struts2</filter-name>     <url-pattern>/*</url-pattern> </filter-mapping>  OK,该方法巧妙的解决了struts2和FCKeditor整合后不能上传图片的问题,需要改动的系统配置非常少,只需自定义一个拦截器,然后改一下struts的拦截器类为自定义的拦截器类,就这么简单……

热点排行