前提是,FCKeditor已經整合到你的Web項目中,FCKeditor已經可以使用,但就是在上傳圖片的時候一直停住不動,如下圖。如果FCKeditor單純地在jsp頁面上顯示,不會存在這樣的問題。但是如果FCKeditor與Struts整合,就會出現這樣的問題。造成此問題的原因就是Struts的攔截器,在web.xml配置文件中,可以清楚的看到:
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
就是上面這個配置,Struts會攔截所以以“/”開頭的URL。
在FCKeditor的配置中,FCKeditor是使用servlet來實現的,它也是通過攔截URL的機制進行工作的,FCKeditor的部分servlet配置如下:
<!-- fckeditor 配置 by lyf 2014-09-12 start -->
<servlet>
<servlet-name>Connector</servlet-name>
<servlet-class>
net.fckeditor.connector.ConnectorServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Connector</servlet-name>
<url-pattern>/js/fckEditor/editor/filemanager/connectors/*</url-pattern>
</servlet-mapping>
<!-- fckeditor 配置 by lyf 2014-09-12 end -->
現在就很明了了,struts攔截所有以“/”開頭的URL,FCKeditor的servlet攔截所有以“/js/fckEditor/editor/filemanager/connectors/”開頭的URL,當你使用FCKeditor上傳圖片的時候,URL中包含有“/”(指網站根目錄),優先被struts的攔截器攔截,這樣上傳圖片的URL請求自然就不會轉發到FCKeditor的servlet,所以我們上傳圖片也就不成功。
解決辦法:自己定義了一個過濾器FCKFilter.java,讓它繼承Struts2的過濾器StrutsPrepareAndExecuteFilter,完整代碼如下:
package com.ckms.filter;
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;
/**
* 類名稱:FCKFilter
* 類描述:解決struts2 FCKeditor不能上傳圖片的問題
* 創建人:lyf
* 創建時間:2014-9-12 上午10:19:08
* 修改人:lyf
* 修改時間:2014-9-12 上午10:19:08
* 修改備注:
* @version 1.0
*
*/
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();
// 此處的值要和 web.xml 中fck配置的路徑開頭一致 -->
String[] uriArray = URI.split("/js/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攔截規則“/js/fckEditor/editor/filemanager/connectors/”,若包含,struts就不攔截該url請求,而是直接轉發,交由FCKeditor的servlet來處理;若不包含,則攔截該url請求,由struts來處理。
自定義的過濾器寫完之後,要在web.xml中更改struts的攔截器類,不能再使用struts的默認攔截器類StrutsPrepareAndExecuteFilter。但是請放心,自定義的過濾器FCKFilter繼承了StrutsPrepareAndExecuteFilter裡的所有的方法,因此項目依然照常運行。
該方法巧妙的解決了struts2和FCKeditor整合後不能上傳圖片的問題,需要改動的系統配置非常少,只需自定義一個攔截器,然後改一下struts的攔截器類為自定義的攔截器類。
修改後的web.xml:
<filter>
<filter-name>struts2</filter-name>
<!-- 解決struts2 FCKeditor不能上傳圖片的問題
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
-->
<filter-class>com.ckms.filter.FCKFilter</filter-class>
</filter>
SSH2 struts2 FCKeditor在線編輯器實現 http://www.linuxidc.com/Linux/2013-04/82955.htm
Struts2的入門實例 http://www.linuxidc.com/Linux/2013-05/84618.htm
Struts2實現ModelDriven接口 http://www.linuxidc.com/Linux/2014-04/99466.htm
遇到的Struts2文件下載亂碼問題 http://www.linuxidc.com/Linux/2014-03/98990.htm
Struts2整合Spring方法及原理 http://www.linuxidc.com/Linux/2013-12/93692.htm
Struts2 注解模式的幾個知識點 http://www.linuxidc.com/Linux/2013-06/85830.htm
Struts 的詳細介紹:請點這裡
Struts 的下載地址:請點這裡