最近遇到需要隐藏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完整jar文件^_^
apache-cxf-2.7.4 cxf webservice
从官网下载的cxf包太多,实际应用中,绝大部分都是非必须的,为了方便广大学习者,本附件提供了spring3.0.7与cxf2.7.4整合所需要的最少jar包,欢迎大家下载!
注意: 1.如果想学习java优先请访问...2.包含一个eclipse工程以及一个ppt,ppt详细说明了实现的步骤。 3.设计中重点考察了schema validate的配置与实现,后续更高级的相关知识敬请关注 ...
CXF提供的wsdl2java工具创建客户端的详细步骤
NULL 博文链接:https://hongyegu.iteye.com/blog/637103
使用cxf wsdl2java生成webservice客户端命令
cxf Myeclipse WSDL 所需要的所有jar包cxf Myeclipse WSDL 所需要的所有jar包cxf Myeclipse WSDL 所需要的所有jar包
apache-cxf将wsdl生成java文件
赠送jar包:cxf-rt-wsdl-3.0.1.jar; 赠送原API文档:cxf-rt-wsdl-3.0.1-javadoc.jar; 赠送源代码:cxf-rt-wsdl-3.0.1-sources.jar; 赠送Maven依赖信息文件:cxf-rt-wsdl-3.0.1.pom; 包含翻译后的API文档:cxf-rt...
以注释的形式详细描述wsdl文件中的内容 type message portType bing service
cxf服务端wsdl发布帮助.docxcxf服务端wsdl发布帮助.docx
cxf服务端wsdl发布帮助
apache CXF wsdl2java工具使用说明