`
victor71
  • 浏览: 1211 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

CXF2.7.4 隐藏wsdl

 
阅读更多

最近遇到需要隐藏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替换掉。

 

先写到这了.....

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics