轉: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的攔截器類爲自定義的攔截器類,就這麼簡單……

相關文章
相關標籤/搜索