下面对这两种情况写代码进行处理:
1、集成Web容器
Java代码
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即可
Xml代码
<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来发布服务
Java代码
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();
}
再看看拦截器的代码
Java代码
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替换掉。
先写到这了.....