参考文章:
http://yongkuang.iteye.com/blog/1172403
许多人用FCKeditor,没用struts2的时候上传可以成功,但是一用上struts2就上传失败,提示的是没有权限!是因为web.xml配置了
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
导致struts2把FCKeditor的请求过滤了!
------------------------------解决办法------------------------------
既然是Structs2拦截了,那就修改下拦截器配置,把FCKEditor放过去就行啦
这里我们重写了个拦截类;
package 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;
public class MyStrutsPrepareAndExecuteFilter 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方法,执行的原理为:
获得完整的http url地址,然后判断url地址中是否包含有FCKeditor的servlet拦截规则“/fckeditor/editor/filemanager/connectors/”,若包含,struts就不拦截该url请求,而是直接转发,交由FCKeditor的servlet来处理;若不包含,则拦截该url请求,由struts来处理。
然后再修改Web.xml里Structs2的配置:
<!-- Struts2过滤器配置 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>filter.MyStrutsPrepareAndExecuteFilter</filter-class>
</filter>