CXF 封装的接口,不希望对外暴露 WSDL结构,找到的CXF安全认证技术都是基于拦截器,在调用的时候返回认证错误信息, 不能保护WSDL不被看到,后来看到别人的一个实现方式最简单有效,基于URL拦截的安全保护,用FILTER。现在把这2种安全保护都记录下来,备用。
WSDL保护:
参考:http://www.myexception.cn/open-source/1505475.html
FILTER:
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub HttpServletRequest httpRequest = (HttpServletRequest)request; Enumeration<String> enumeration = httpRequest.getParameterNames(); while (enumeration.hasMoreElements()) { String param = (String) enumeration.nextElement(); // 查找是否含有参数wsdl,因为使用WSDL也可以,所以这里比较时必须不区分大小写 if (StringUtils.endsWithIgnoreCase("wsdl", param)) { response.getOutputStream().write("Servlet不存在".getBytes()); return; } } chain.doFilter(request, response); }
配置的FILTER:
<url-pattern>/pe/*</url-pattern>
注:开始的时候配置的项目名/PEService ,地址是:http://localhost:8080/PEService/getResponse发现拦截不到,这个Servlet配置的名称只能拦截到项目名称之后的地址,即http://localhost:8080/PEService/之后的路径才能匹配,于是重新配置发布的地址<jaxws:endpoint id="getresponse" address="/pe/getResponse"
拦截/pe/*,成功匹配。
试图访问?WSDL结尾的地址都被拦截。
CXF安全认证参考:http://blog.csdn.net/hujiao_jingling/article/details/7239997
package com.hy; import java.util.List; import javax.xml.soap.SOAPException; import org.apache.cxf.binding.soap.SoapHeader; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.headers.Header; import org.apache.cxf.helpers.XMLUtils; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.message.Message; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.w3c.dom.Element; import org.w3c.dom.NodeList; public class AuthIntercetpr extends AbstractPhaseInterceptor<SoapMessage> { //private static final Logger logger = Logger.getLogger(AuthIntercetpr.class); public static final String xml_namespaceUR_att = "http://gd.chinamobile.com//authentication"; public static final String xml_header_el = "soap:Header"; public static final String xml_authentication_el = "auth:authentication"; public static final String xml_systemID_el = "auth:systemID"; public static final String xml_userID_el = "auth:userID"; public static final String xml_password_el = "auth:password"; public AuthIntercetpr() { // 指定该拦截器在哪个阶段被激发 super(Phase.READ); } // 处理消息 public void handleMessage(SoapMessage message) { //logger.info("==================SoapMessage =" + message); // 获取SOAP消息的全部头 String method = (String)message.get(Message.HTTP_REQUEST_METHOD); List<Header> headers = message.getHeaders(); if (null == headers || headers.size() < 1) { throw new Fault(new SOAPException("SOAP消息头格式不对哦!")); } for (Header header : headers) { SoapHeader soapHeader = (SoapHeader) header; // 取出SOAP的Header元素 Element element = (Element) soapHeader.getObject(); //logger.info("ELEMENT =" + element.toString()); XMLUtils.printDOM(element); NodeList userIdNodes = element .getElementsByTagName(xml_userID_el); NodeList pwdNodes = element .getElementsByTagName(xml_password_el); NodeList systemIdNodes = element .getElementsByTagName(xml_systemID_el); /*logger.info("############ 打印帐号信息 ##############"); logger.info(userIdNodes.item(0) + "=" + userIdNodes.item(0).getTextContent()); logger.info(systemIdNodes.item(0) + "=" + systemIdNodes.item(0).getTextContent()); logger.info(pwdNodes.item(0) + "=" + pwdNodes.item(0).getTextContent()); logger.info("############————————##############");*/ if (null != userIdNodes && userIdNodes.item(0).getTextContent().equals("test") ) { if (null != pwdNodes && pwdNodes.item(0).getTextContent().equals("test")) { //logger.info("$$$$$$$$ 认证成功"); } else {//认证失败则抛出异常,停止继续操作 SOAPException soapExc = new SOAPException("阁下可能不是合法用户!"); throw new Fault(soapExc); } } else {//认证失败则抛出异常,停止继续操作 SOAPException soapExc = new SOAPException("阁下可能不是合法用户!"); throw new Fault(soapExc); } } } }
将该类配置到CXF中:
<!--拦截器--> <bean id="authIntercetpr" class="com.hy.AuthIntercetpr"></bean> <!-- 上面不用管 ,id随意,implementor是实现类,address在客户端的地址中会用到--> <jaxws:endpoint id="getresponse" implementor="com.hy.TestImpl" address="/pe/getResponse" publish="false"> <jaxws:inInterceptors> <!-- 在此配置调用当前ws所触发的拦截器--> <ref bean="authIntercetpr" /> </jaxws:inInterceptors> </jaxws:endpoint>
访问调用地址http://localhost:8080/PEService/pe/getResponse报错:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <soap:Fault> <faultcode>soap:Server</faultcode> <faultstring>SOAP消息头格式不对哦!</faultstring> </soap:Fault> </soap:Body> </soap:Envelope>
相关推荐
本篇将深入探讨如何使用Apache CXF进行Web服务的安全验证。 首先,我们要了解Web服务安全的基本概念。Web服务安全通常涉及身份验证、授权、加密和消息完整性。Apache CXF支持多种安全模型,包括基本认证、digest...
使用jdk1.6、cxf2.3和tomcat开发的一个关于验证码的webservice接口,主要实现对手机验证码的验证。
【标题】"mybatis+spring+cxf Webservice框架"是一个集成性的开发框架,它结合了三个主流的技术组件:MyBatis、Spring和Apache CXF,用于构建高效、灵活且易于维护的Web服务。MyBatis是一个优秀的持久层框架,Spring...
8. **安全与认证**:CXF支持多种安全机制,包括基本认证、digest认证、WS-Security等,确保Web服务的安全性。开发者可以根据需要添加相应的安全配置。 9. **错误处理与日志**:CXF提供了详细的错误处理机制和日志...
本教程将深入探讨如何将Apache CXF与Spring框架结合,实现一个完整的Web服务传输验证的示例。CXF是一个开源服务框架,它支持多种Web服务标准,包括SOAP和RESTful服务,而Spring则为应用程序提供了全面的依赖注入和...
综上所述,这个CXF Webservice示例工程涵盖了Spring集成、Web服务安全、大文件传输优化以及不同类型数据的处理,是学习和实践CXF框架的理想起点。通过对这些知识点的深入理解和实践,开发者能够更好地掌握如何在实际...
总结起来,"CXF WebService带有拦截器"的实践是Web服务开发中的一个重要方面,它允许我们在不侵入核心业务逻辑的情况下,增加诸如权限控制这样的安全特性。通过"AuthFilter_Service"和"AuthFilter_Client",我们可以...
2. **创建WebService**: 使用CXF,首先需要定义服务接口,通常是一个Java接口,然后提供其实现。Spring会自动扫描并注册这些服务。在Spring配置文件中,可以通过`<jaxws:endpoint>`标签来声明一个CXF Web服务,...
例如,你可以配置CXF来实现基于证书的身份验证、消息加密和签名,以增强Web服务的安全性。对于性能,CXF允许你调整缓存策略、启用HTTP连接池等,以提高服务响应速度。 总的来说,CXF是一个强大的工具,它简化了Java...
### CXF实现SSL安全验证 在现代网络应用中,安全通信是至关重要的。Apache CXF 是一个开源项目,提供了一套强大的工具和服务框架,用于构建和开发基于标准的服务(如 Web Services)。本文将详细介绍如何使用 CXF ...
总的来说,通过CXF Webservice实现文件分块上传是一个复杂但实用的系统设计,它结合了网络通信、文件操作、错误处理和安全性等多个方面的知识,对于提升大型文件传输的效率和可靠性具有重要意义。
【标题】"cxf webService简单例子"是一个关于使用Apache CXF框架创建和消费Web服务的基础教程。Apache CXF是一个开源的Java框架,它允许开发者创建和实现符合各种Web服务标准(如SOAP、RESTful)的服务。这个例子将...
【Spring-CXF WebService】是基于Spring框架和Apache CXF实现的一个Web服务示例,它展示了如何在Spring环境中集成CXF来创建、部署和消费Web服务。Spring-CXF结合了Spring的强大功能和CXF的优秀Web服务支持,使得开发...
### CXF 开发 WebService 服务端详解 #### 一、引言 随着企业级应用对服务化的不断追求,Web Service 成为了实现不同系统间通信的重要手段之一。Apache CXF 是一个高性能、易于使用的框架,它支持多种协议,如SOAP...
Apache Cxf WebService整合Spring 处理Map、非javabean式的复合类等CXF无法自动转化的类型 CXF为服务器端和客户端添加自定义拦截器进行权限检查验证并且控制台打印日志
在IT行业中,CXF是一个广泛使用的开源框架,用于开发和实现Web服务,无论是SOAP(简单对象访问协议)还是RESTful风格的服务。本篇文章将详细探讨如何利用CXF框架开发一个Web服务客户端,以及如何进行测试。 一、CXF...
3. **wss4j-1.5.11.jar**:Web Services Security for Java(WSS4J)是Apache提供的安全框架,它为CXF提供了Web服务安全支持,如数字签名、加密、身份验证等。 4. **jetty-server-7.2.2.v20101205.jar** 和 **jetty...
本文将深入探讨如何使用CXF框架结合ws-security标准来实现对Java客户端调用Web服务的安全接口。CXF是一个开源的服务框架,它允许开发人员创建和消费各种Web服务,而ws-security(Web Services Security)则是用于...
2. **安全性**:CXF提供多种安全机制,如SSL/TLS加密、WS-Security(Web Services Security)支持,可以实现身份验证、消息完整性及保密性。 3. **拦截器和插件**:CXF允许自定义拦截器和插件,扩展服务行为,如...