转:struts2 FCKeditor不能上传图片的问题解决

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

  1. <filter-mapping> 
  2.     <filter-name>struts2</filter-name> 
  3.     <url-pattern>/*</url-pattern> 
  4. </filter-mapping>  

就是上面这个配置,Struts会拦截因此以“/”开头的URL。 java

转:struts2 <wbr>FCKeditor不能上传图片的问题解决

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

在FCKeditor的配置中,FCKeditor是使用servlet来实现的,它也是经过拦截URL的机制进行工做的,FCKeditor的部分 apache

 

servlet配置以下: app

  1. <servlet-mapping> 
  2.    <servlet-name>Connector</servlet-name> 
  3.    <url-pattern>/fckeditor/editor/filemanager/connectors/*</url-pattern> 
  4. </servlet-mapping> 

如今就很明了了,struts拦截全部以“/”开头的URL,FCKeditor的servlet拦截全部以“/fckeditor/editor/filemanager/connectors/”开头的URL,当你使用FCKeditor上传图片的时候,URL中包含有“/”(指网站根目录),优先被struts的拦截器拦截,这样上传图片的URL请求天然就不会转发到FCKeditor的servlet,因此咱们上传图片也就不成功。 jsp

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

答案是确定的。我本身定义了一个过滤器FCKFilter.java,让它继承Struts2的过滤器StrutsPrepareAndExecuteFilter,完整代码以下: url

  1. package com.olympus.sapg.smtinnovation.util.method; 
  2.  
  3. import java.io.IOException; 
  4.  
  5. import javax.servlet.FilterChain; 
  6. import javax.servlet.ServletException; 
  7. import javax.servlet.ServletRequest; 
  8. import javax.servlet.ServletResponse; 
  9. import javax.servlet.http.HttpServletRequest; 
  10.  
  11. import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter; 
  12.  
  13. public class FCKFilter extends StrutsPrepareAndExecuteFilter { 
  14.     public void doFilter(ServletRequest req,ServletResponse res, FilterChain chain) throws IOException, ServletException {   
  15.         HttpServletRequest request = (HttpServletRequest) req;  
  16.         String URI = request.getRequestURI(); 
  17.         String[] uriArray = URI.split("/fckeditor/editor/filemanager/connectors/"); 
  18.         int arrayLen = uriArray.length; 
  19.         if (arrayLen >= 2) { 
  20.             chain.doFilter(req, res);  
  21.         }else { 
  22.             super.doFilter(req, res, chain);   
  23.         } 
  24.     }  

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

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

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

<!-- struts2 --> 

  1. <filter>  
  2.     <filter-name>struts2</filter-name> 
  3.     <filter-class>com.olympus.sapg.smtinnovation.util.method.FCKFilter</filter-class> 
  4.     <init-param> 
  5.         <param-name>actionPackages</param-name> 
  6.         <param-value>com.olympus.sapg.smtinnovation.action</param-value> 
  7.     </init-param> 
  8. </filter> 
  9.  
  10. <filter-mapping> 
  11.     <filter-name>struts2</filter-name> 
  12.     <url-pattern>/*</url-pattern> 
  13. </filter-mapping>  

OK,该方法巧妙的解决了struts2和FCKeditor整合后不能上传图片的问题,须要改动的系统配置很是少,只需自定义一个拦截器,而后改一下struts的拦截器类为自定义的拦截器类,就这么简单……

相关文章
相关标签/搜索