前提是,FCKeditor已經整合到你的Web項目中,FCKeditor已經可使用,但就是在上傳圖片的時候一直停住不動,以下圖。若是FCKeditor單純地在jsp頁面上顯示,不會存在這樣的問題。可是若是FCKeditor與Struts整合,就會出現這樣的問題。形成此問題的緣由就是Struts的攔截器,在web.xml配置文件中,能夠清楚的看到: html
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
就是上面這個配置,Struts會攔截因此以「/」開頭的URL。 java
關於將FCKeditor整合到Web項目中,能夠參考《Java FckEditor 2.6+JSP的配置方法詳解》。 web
在FCKeditor的配置中,FCKeditor是使用servlet來實現的,它也是經過攔截URL的機制進行工做的,FCKeditor的部分 apache
servlet配置以下: app
- <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,因此咱們上傳圖片也就不成功。 jsp
網上有不少解決方法,但多數是修改struts的攔截範圍,如將"/*"改爲"*.do"或"*.action"之類的。這不是一個好方法,由於在個人項目中,我沒有使用do或action的URL擴展,這樣顯然不能解決個人問題,那麼有沒有一個更加完美的解決方法呢? 網站
答案是確定的。我本身定義了一個過濾器FCKFilter.java,讓它繼承Struts2的過濾器StrutsPrepareAndExecuteFilter,完整代碼以下: url
- 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方法,執行的原理爲: 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 -->
- <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的攔截器類爲自定義的攔截器類,就這麼簡單……