在用struts2整合cxf提供webservice供外部调用时,会出现访问路径冲突问题,原因是struts2的过滤器把所有的请求都拦截了,当我们调用webservice时,也会被拦截,在路由map中找不到匹配的路径 则报错。
1)解决方法:
1:新建一个类继承struts2中提供的过滤器类
2:重写doFiter方法,对调用webservice的访问路径放行,其他的则默认执行struts2的拦截流程
3:在web.xml 使用我们定义的过滤器类替换掉struts2的
2)实现代码
package yuan.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 YuanStrutsPrepareAndExecuteFilter extends
StrutsPrepareAndExecuteFilter {
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
// 对调用webservice的访问路径放行
if (request.getRequestURI().contains("/services")) {
chain.doFilter(req, res);
} else {
super.doFilter(req, res, chain);
}
}
}
3)在web.xml中使用重写后的过滤器类替换掉struts2的:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<!-- cxf 整合spring -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:yuan/resource/application.xml</param-value>
</context-param>
<filter>
<filter-name>structs2</filter-name>
<filter-class>yuan.filter.YuanStrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>structs2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>