Fckeditor和struts2结合使用解决不能上传图片的问题


前提是,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>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值