struts2整合CKEditor实现上传

1
Java XML C/C++ Struts2 Go 15919 次浏览
之前折腾了下CKEditor和CKFinder实现上传功能,今想来把这个文本编辑器应用到一个自己在做的练手项目中,实现与Struts2的整合,整合的过程so easy.但图片死活上传不上去.那个整合啊,那个蛋疼啊. 经过不懈的努力问题发现了,原来是被struts2搞了.此问题的原因就是struts2的拦截器,在web.xml中,可以清楚的看到:
 <filter-mapping> 
        <filter-name>struts2</filter-name> 
        <url-pattern>/*</url-pattern> 
    </filter-mapping>  
上面的配置,struts2会拦截所有以"/"开头的URL.
在CKEditor的配置中,CKEditor是使用servlet来实现的,它也是通过拦截URL的机制进行工作的,CKeditor的部分servlet配置如下:
<servlet-mapping>
	<servlet-name>ConnectorServlet</servlet-name>
	<url-pattern>/ckfinder/core/connector/java/connector.java</url-pattern>
	</servlet-mapping>
现在就很明了了,struts2拦截器会拦截所有以"/"开头的URL,CKEd的servlet拦截器拦截所有以"
/ckfinder/core/connector/java/connector.java"开头的URL.当时CKEditor上传图片的时 候,URL中包含有"/"(指网站根目录),优先被struts2的拦截器拦截,这样上传的URL请求就不会转发到CKEditor的servlet中, 所有上传图片也就不会成功.

  问题所在找到了,那这个问题就好解决了,最简单的办法是将struts2的拦截器"/*"改成"#.action"或者"*.do"
第二个办法是:
自己来定义一个CKeditor的过滤器,让它来继承Struts2的过滤器FilterDispatcher,其完整代码是
/**
* @Title: FCKFilter.java
* @Package: cn.itcast.utils
* @Description: TODO(用一句话描述该文件做什么)
* @author: 何枫
* @date: 2011-11-1 下午08:49:10
* @version: V1.0
*/
package cn.itcast.utils;
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.FilterDispatcher;

/**
 * @Title: FCKFilter.java
 * @Package: cn.itcast.utils
 * @Description: TODO(用一句话描述该文件做什么)
 * @author: 何枫
 * @date: 2011-11-1 下午08:49:10
 * @version: V1.0
 */
@SuppressWarnings("deprecation")
public class FCKFilter extends FilterDispatcher {
	 public void doFilter(ServletRequest req,ServletResponse res, FilterChain chain) throws IOException, ServletException {   
	        HttpServletRequest request = (HttpServletRequest) req;  
	        String URI = request.getRequestURI(); 
	        String[] uriArray = URI.split("/ckfinder/core/connector/java/*/"); 
	        int arrayLen = uriArray.length; 
	        if (arrayLen >= 2) { 
	            chain.doFilter(req, res);  
	        }else { 
	            super.doFilter(req, res, chain);   
	        } 
	    }  
	} 
 
上面的方法重写了struts2的过滤器FilterDispatcher中的doFilter方法,执行原理为:获得完整的http url的地址,然后判断URL地址中是否包含CKEditor的servlet拦截规则"/ckfinder/core/connector/java /*/",若包含,struts2就不拦截该URL请求,而直接转发,交友CKEditor的servlet来处理;若不包含,ze拦截器拦截该URL请 求,由struts2来处理
自定义的过滤器写完之后,要在web.xml中更改struts2的拦截器类,不能再使用struts2的默认拦截器类 FilterDispatcher 。但是请放心,自定义的过滤器FCKFilter继承了 FilterDispatcher 里的所有的方法,因此项目依然照常运行。
<!-- struts2配置文件 -->
<filter>
		<filter-name>struts2</filter-name>
		<!--
			<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
		-->
		<filter-class>cn.itcast.utils.FCKFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
转自:http://hefeng1987-net-163-com.iteye.com/blog/1231940
请尽量让自己的答案能够对别人有帮助

6个答案

默认排序 按投票排序