struts2整合CKEditor和CKFinder实现上传

news/2024/5/19 1:06:55

上一篇文章给大家分享了CKEditor+CKFinder+JSP实现了在线编辑器上传图片的功能,这里在给大家分享一下如何在前面的基础上在struts2下实现这样的功能。

实现与Struts2的整合,整合的过程确实easy.不过实现之后,图片上传不上去,上传之后显示“文件不存在”,然后在网上找了一些资料,经过总结最终实现了这个功能。此问题的原因就是struts2的拦截器,在web.xml中,可以清楚的看到:

 

[html]  view plain  copy
 
  1. <filter-mapping>   
  2.        <filter-name>struts2</filter-name>   
  3.        <url-pattern>/*</url-pattern>   
  4. </filter-mapping>    

上面的配置,struts2会拦截所有以"/"开头的URL.
在CKEditor的配置中,CKEditor是使用servlet来实现的,它也是通过拦截URL的机制进行工作的,CKeditor的部分servlet配置如下:

 

 

[html]  view plain  copy
 
  1. <servlet-mapping>  
  2.     <servlet-name>ConnectorServlet</servlet-name>  
  3.     <url-pattern>/ckfinder/core/connector/java/connector.java</url-pattern>  
  4. </servlet-mapping>  

现在就很明了了,struts2拦截器会拦截所有以"/"开头的URL,CKEditor的servlet拦截器拦截所有以"
/ckfinder/core/connector/java/connector.java"开头的URL.当时CKEditor上传图片的时 候,URL中包含有"/"(指网站根目录),优先被struts2的拦截器拦截,这样上传的URL请求就不会转发到CKEditor的servlet中, 所有上传图片也就不会成功.
问题所在找到了,那这个问题就好解决了,最简单的办法是将struts2的拦截器"/*"改成"#.action"或者"*.do",可以这样改:

 

 

[html]  view plain  copy
 
  1. <filter-mapping>  
  2.         <filter-name>struts2</filter-name>  
  3.         <url-pattern>*.action</url-pattern>  
  4.     </filter-mapping>  

 

第二个办法是:
自己来定义一个CKeditor的过滤器,让它来继承Struts2的过滤器FilterDispatcher,其完整代码是

 

[java]  view plain  copy
 
  1. package cn.edu.csu.software.filters;  
  2. import java.io.IOException;   
  3.   
  4. import javax.servlet.FilterChain;   
  5. import javax.servlet.ServletException;   
  6. import javax.servlet.ServletRequest;   
  7. import javax.servlet.ServletResponse;   
  8. import javax.servlet.http.HttpServletRequest;   
  9. import org.apache.struts2.dispatcher.FilterDispatcher;  
  10.   
  11. @SuppressWarnings("deprecation")  
  12. public class FCKFilter extends FilterDispatcher {  
  13.      public void doFilter(ServletRequest req,ServletResponse res, FilterChain chain) throws IOException, ServletException {     
  14.             HttpServletRequest request = (HttpServletRequest) req;    
  15.             String URI = request.getRequestURI();   
  16.             String[] uriArray = URI.split("/ckfinder/core/connector/java/*/");   
  17.             int arrayLen = uriArray.length;   
  18.             if (arrayLen >= 2) {   
  19.                 chain.doFilter(req, res);    
  20.             }else {   
  21.                 super.doFilter(req, res, chain);     
  22.             }   
  23.         }    
  24.     }   
  25.    

上面的方法重写了struts2的过滤器FilterDispatcher中的doFilter方法,执行原理为:获得完整的http url的地址,然后判断URL地址中是否包含CKEditor的servlet拦截规则"/ckfinder/core/connector/java /*/",若包含,struts2就不拦截该URL请求,而直接转发,交给CKEditor的servlet来处理;若不包含,则拦截器拦截该URL请 求,由struts2来处理
自定义的过滤器写完之后,要在web.xml中更改struts2的拦截器类,不能再使用struts2的默认拦截器类 FilterDispatcher 。但是请放心,自定义的过滤器FCKFilter继承了 FilterDispatcher 里的所有的方法,因此项目依然照常运行。
<!-- struts2配置文件 -->

 

 

[html]  view plain  copy
 
  1. <filter>  
  2.         <filter-name>struts2</filter-name>  
  3.         <!-- 
  4.             <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> 
  5.         -->  
  6.         <filter-class>cn.itcast.utils.FCKFilter</filter-class>  
  7. </filter>  
  8. <filter-mapping>  
  9.         <filter-name>struts2</filter-name>  
  10.         <url-pattern>/*</url-pattern>  
  11. </filter-mapping>  

本文参考:何枫网友:http://hefeng1987-net-163-com.iteye.com/blog/1231940


http://www.niftyadmin.cn/n/2210919.html

相关文章

adb.exe可能被其他程序关闭_如何正确关闭你的Windows 10 PC,你有必要知道

这句话听起来似乎很奇怪&#xff0c;有人会问难道最简单的关机我还不会吗&#xff1f;但是当你单击开始菜单上的电源按钮来关闭你的Windows 10时&#xff0c;你可能并没有真正关闭Windows 10。当然&#xff0c;Windows 10确实经历了关闭的过程&#xff0c;结果看上去你的计算机…

SoucreInsight4.0选择变量高亮其他相同变量也高亮

在使用SoucreInsight时&#xff0c;选择一个变量变高亮&#xff0c;同时也希望相同的变量变高亮。 步骤 1、选择"Options->File Type Options…(AIt Y)",进入界面。 2、勾选Hightlight references to selected symbol

三菱plc pwm指令_三菱PLC的指令代码,纯干货,需要的保存吧

三菱PLC三菱PLC的指令代码一 顺控指令1 触点指令00 LD 逻辑操作开始01 LDI 逻辑非操作开始02 AND 逻辑乘03 ANI 逻辑乘非04 OR 逻辑加05 ORI 逻辑加非2 连接指令06 ANB AND逻辑块与07 ORB OR逻辑块或08 MPS 存储操作结果09 MRD 从MPS读取操作结果10 MPP 从MPS读取操作结果并清除…

Hbase 学习(二)各种filter

各种filter 今天的主题是Filter&#xff0c;hbase客户端查询的时候&#xff0c;自定义查询filter。直接上例子吧&#xff0c;不多说别的了&#xff0c;第一个例子是RowFilter的。Scan scan new Scan(); scan.addColumn(Bytes.toBytes("colfam1"), Bytes.toBytes(&qu…

什么是mysql事物定义_数据库事务的概念及其实现原理

以下所有内容都是针对单机事务而言,不涉及分布式事务相关的东西!关于事务原理的讲解不针对具体的某个数据库实现,所以某些地方可能和你的实践经验不符。1. 认识事务1.1 为什么需要数据库事务转账是生活中常见的操作,比如从A账户转账100元到B账号。站在用户角度而言,这是一个逻辑…

aes key iv从mysql,如何安全地处理AES“Key”和“IV”值

If I use AES (System.Security.Cryptography) to simply encrypt and decrypt blob or memo fields in a SQL server, then where do I store the “Key” and “IV” values on the server? (File, Regkey, Dbase,...)And what with the protection of those AES “Key” an…

qmake工具生成项目文件与Makefile文件

qmake 是一个协助简化跨平台进行专案开发的构建过程的工具程式&#xff0c;也是Qt附带工具之一。可以根据项目环境构建.pro项目文件&#xff0c;再根据项目文件生成Makefile文件。相对于手写一个项目Makefile来说&#xff0c;使用qmake生成Makefile比较简便。 查看qmake Ubu…

谈谈对Canal(增量数据订阅与消费)的理解

概述 canal是阿里巴巴旗下的一款开源项目&#xff0c;纯Java开发。基于数据库增量日志解析&#xff0c;提供增量数据订阅&消费&#xff0c;目前主要支持了mysql&#xff08;也支持mariaDB&#xff09;。 起源&#xff1a;早期&#xff0c;阿里巴巴B2B公司因为存在杭州和美国…