最近遇到需要隐藏wsdl的需求,在网上找了很多资料,没有找到cxf可以配置不生成wsdl。于是只能想别的办法。
这里分两种情况,一种是CXF被集成到Web容器中,这种情况下比较好处理,增加filter就可以了。还有一种情况是CXF使用内置的jetty容器发布webservice服务,这种情况下也好处理,需要增加Interceptor来做拦截。
下面对这两种情况写代码进行处理:
1、集成Web容器
package demo.hw.filter; import java.io.IOException; import java.util.Enumeration; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; public class WSDLFilter implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest)request; Enumeration<String> enumeration = httpRequest.getParameterNames(); while (enumeration.hasMoreElements()) { String param = (String) enumeration.nextElement(); // 查找是否含有参数wsdl,因为使用WSDL也可以,所以这里比较时必须不区分大小写 if (StringUtils.endsWithIgnoreCase("wsdl", param)) { return; } } chain.doFilter(request, response); } @Override public void init(FilterConfig arg0) throws ServletException { } }
然后配置下 filter和需要过滤的url-pattern即可
<filter> <filter-name>WSDLFilter</filter-name> <filter-class>demo.hw.filter.WSDLFilter</filter-class> </filter> <filter-mapping> <filter-name>WSDLFilter</filter-name> <url-pattern>/Complex</url-pattern> </filter-mapping>
2、使用内置Jetty容器
这里使用JaxWsServerFactoryBean来发布服务
protected Server() throws Exception { System.out.println("Starting Server"); ComplexImpl complexImpl = new ComplexImpl(); String address = "http://localhost:9000/Complex"; JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean(); factoryBean.setAddress(address); factoryBean.setServiceBean(complexImpl); //增加拦截器,放在最前面 factoryBean.getInInterceptors().add(0, new WSDLInterceptor()); factoryBean.create(); }
再看看拦截器的代码
package demo.hw.server; import org.apache.cxf.binding.soap.interceptor.EndpointSelectionInterceptor; import org.apache.cxf.common.util.StringUtils; import org.apache.cxf.common.util.UrlUtils; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.message.Message; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; public class WSDLInterceptor extends AbstractPhaseInterceptor<Message>{ public WSDLInterceptor() { super(Phase.READ); getAfter().add(EndpointSelectionInterceptor.class.getName()); } @Override public void handleMessage(Message message) throws Fault { String method = (String)message.get(Message.HTTP_REQUEST_METHOD); String query = (String)message.get(Message.QUERY_STRING); if (!"GET".equals(method) || StringUtils.isEmpty(query)) { return; } if (UrlUtils.parseQueryString(query).containsKey("wsdl")) { message.getInterceptorChain().abort(); return; } } }
在较早的版本中,CXF使用QueryHandler来处理 wsdl查询请求。可以想办法将WSDLQueryHandler替换掉。
先写到这了.....
相关推荐
CXF2.7.4是这个框架的一个特定版本,发布于2013年。在这个版本中,开发者可以找到一系列的JAR文件,这些文件包含了CXF的核心功能和依赖库。"CXF2.7.4完整架包"意味着你得到了该版本的所有组件,可以用于搭建或升级...
提供的压缩包"spring3.0.7与cxf2.7.4整合jar包"正是为了简化这个过程,只包含整合所需的核心库,避免了下载大量不必要的依赖,对于初学者和快速原型开发来说非常实用。记得根据你的项目需求,将这些库添加到你的类...
5. **工具集**:CXF提供了各种工具,如WSDL(Web Services Description Language)到Java代码的生成器、服务测试客户端、WS-*政策编辑器等,极大地简化了开发过程。 6. **模块化设计**:Apache CXF的设计是高度模块...
6. **模块化结构**:CXF的2.6.6版本可能包含多个模块,每个模块专注于特定的功能,如CXF-RT-TRANSPORTS对应于不同的传输层实现,CXF-RT-WSDL处理WSDL相关的工作等。 7. **RESTful服务**:CXF对RESTful风格的支持...
在"webService工程"中,CXF2.7.4版本被用来实现Web服务的发布和调用,提供服务端点的实现和客户端的代理。 **Jackson**: Jackson是一个高性能的JSON处理器,用于JSON序列化和反序列化。在本工程中,Jackson库可能...
cxf-api-2.7.4.jar cxf-rt-bindings-soap-2.7.4.jar cxf-rt-bindings-xml-2.7.4.jar cxf-rt-core-2.7.4.jar cxf-rt-databinding-jaxb-2.7.4.jar cxf-rt-frontend-jaxws-2.7.4.jar cxf-rt-frontend-simple-2.7.4.jar ...