前一段时间写了一篇CXF密码验证_服务端和客户端配置
当时没有系统的讲解:
个人认为CXF认证方式很多.一种就像上一篇文章写的是直接对传送的数据包进行密码封装!
另一种就是现在要介绍的是另外一种.对SOAP头处理..把需要验证的密码封装在SOAP头里传送!
可能表达不是很清楚..看代码吧:
1:服务端spring里的配置:
<bean id="Customer" class="org.web.HelloServiceImpl"></bean>
<jaxws:endpoint id="custom" implementor="#Customer" address="/web" >
<jaxws:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
<!--<bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" />
-->
<bean class="org.web.soapHeader.ReadSoapHeader"></bean>
<!--<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken" />
<entry key="passwordType"
value="PasswordText" />
<entry key="user" value="cxfServer" />
<entry key="passwordCallbackRef">
<ref bean="serverPasswordCallback" />
</entry>
</map>
</constructor-arg>
</bean> -->
</jaxws:inInterceptors>
</jaxws:endpoint>
这个里面是有注释的..区别上一个密码验证的示例!
关键代码就有一句: <bean class="org.web.soapHeader.ReadSoapHeader"></bean>
这个是自己写的读取soap信息.查看密码是否正确!
2:soap读入信息的验证:ReadSoapHeader代码:
public class ReadSoapHeader extends AbstractPhaseInterceptor<SoapMessage> {
private SAAJInInterceptor saa=new SAAJInInterceptor();
public ReadSoapHeader(){
super(Phase.PRE_PROTOCOL);
getAfter().add(SAAJInInterceptor.class.getName());
}
public void handleMessage(SoapMessage message) throws Fault {
SOAPMessage mess=message.getContent(SOAPMessage.class);
if(mess==null){
saa.handleMessage(message);
mess=message.getContent(SOAPMessage.class);
}
SOAPHeader head=null;
try {
head = mess.getSOAPHeader();
} catch (SOAPException e) {
e.printStackTrace();
}
if(head==null){
return;
}
NodeList nodes=head.getElementsByTagName("tns:spId");
NodeList nodepass=head.getElementsByTagName("tns:spPassword");
if(nodes.item(0).getTextContent().indexOf("wdw")!=-1){
if(nodepass.item(0).getTextContent().equals("wdwsb")){
System.out.println("认证成功");
}
}
else{
SOAPException soapExc=new SOAPException("认证错误");
throw new Fault(soapExc);
}
}
}
功能:判断客户端传来的soap信息头是否有密码..有的话判断是否正确!
3:客户端spring的配置:
<bean id="webTest" class="org.web.HelloService" factory-bean="client" factory-method="create"/>
<bean id="client" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean" >
<property name="address" value="http://127.0.0.1:88/Hello/web/web"></property>
<property name="serviceClass" value="org.web.HelloService"></property>
<property name="outInterceptors">
<list>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
<!--<bean class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor" /> -->
<bean class="org.web.soapHeader.AddSoapHeader"></bean>
<!--<bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken" />
<entry key="passwordType" value="PasswordText" />
<entry key="user" value="cxfClient" />
<entry key="passwordCallbackRef">
<ref bean="clientPasswordCallback" />
</entry>
</map>
</constructor-arg>
</bean>
-->
</list>
</property>
</bean>
PS:注意注释>...重点是:
<bean class="org.web.soapHeader.AddSoapHeader"></bean>
4:对soap进行如入头信息.把密码加进去:AddSoapHeader代码:
public class AddSoapHeader extends AbstractSoapInterceptor {
private static String nameURI="http://127.0.0.1/Hello/web";
public AddSoapHeader(){
super(Phase.WRITE);
}
public void handleMessage(SoapMessage message) throws Fault {
SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date=new Date();
String time =sd.format(date);
String spPassword="wdwsb";
String spName="wdw";
QName qname=new QName("RequestSOAPHeader");
Document doc=DOMUtils.createDocument();
Element spId=doc.createElement("tns:spId");
spId.setTextContent(spName);
Element spPass=doc.createElement("tns:spPassword");
spPass.setTextContent(spPassword);
Element root=doc.createElementNS(nameURI, "tns:RequestSOAPHeader");
root.appendChild(spId);
root.appendChild(spPass);
SoapHeader head=new SoapHeader(qname,root);
List<Header> headers=message.getHeaders();
headers.add(head);
}
}
很简单的东西...现在密码已经加进去了...spring里也已经配置好了..
客户端就可以正常的请求了..对请求的内容会进行soap头处理.把密码加进去....
服务端通过了客户端的权限密码请求就可以了.
东西很简单..不用过多的讲解了吧...
有什么疑问和见解..请提出来...大家共同学习!!
........
分享到:
相关推荐
标题中的"CXF处理不规则SOAP message(转)"指出,这篇内容主要涉及的是Apache CXF框架在处理非标准或不规范的SOAP(简单对象访问协议)消息时的问题和解决方案。SOAP是Web服务的一种通信协议,用于交换结构化的、...
<import resource="classpath:META-INF/cxf/cxf.xml"/> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/> <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
1. **CXF Interceptors机制**:CXF采用了一种基于拦截器的架构,允许开发者在消息处理的不同阶段插入自定义的行为。这些拦截器可以被用来执行各种任务,比如安全检查、日志记录等。 2. **Logging Message**:CXF内部...
CXF提供了一套全面的工具和服务,包括代码生成器、WSDL到Java绑定、Java到WSDL绑定、SOAP消息处理和安全支持等。它的优势在于对WS-I兼容性、强大的错误处理和调试能力。 3. **创建SOAP服务** 使用CXF,我们可以从...
在IT行业中,CXF是一个广泛使用的开源框架,它支持服务导向架构(SOA)并通过SOAP协议提供Web服务。Spring框架则是Java应用开发的核心框架,它提供了丰富的功能来管理bean、处理事务、AOP(面向切面编程)等。将CXF...
4. cxf-rt-bindings-soap.jar:SOAP绑定组件,用于处理SOAP消息。 5. spring-context.jar:Spring的核心上下文库,包含IoC和AOP支持。 6. spring-web.jar:Spring的Web支持,用于在Web环境中集成Spring。 7. javax....
【标题】"用CXF开发SOAP接口"涉及的是在Java环境中使用Apache CXF框架来创建、实现和消费基于SOAP(Simple Object Access Protocol)的Web服务。SOAP是一种用于交换结构化和类型化的信息的协议,常用于企业级应用...
3. **消息处理**:CXF允许自定义SOAP消息的处理逻辑,包括编码、解码和异常处理。 4. **互操作性**:由于CXF对SOAP和WSDL的强大支持,它提高了与其他平台和语言的Web服务之间的互操作性。 此外,作为一个开源项目,...
赠送jar包:cxf-rt-bindings-soap-3.0.1.jar; 赠送原API文档:cxf-rt-bindings-soap-3.0.1-javadoc.jar; 赠送源代码:cxf-rt-bindings-soap-3.0.1-sources.jar; 赠送Maven依赖信息文件:cxf-rt-bindings-soap-...
spring + cxf + restful + soap 方便初学者很快上手。 注解描述 @Path注解的值是一个相对的URI路径,这个路径指定了该Java类的位置,例如/helloworld。在这个URI中可以包含变量,例如可以获取用户的姓名然后作为参数...
标题 "cxf-soap内容解析、更改(助记)" 指向的是...但是,对于学习和实践CXF SOAP处理,可以参考官方文档、相关教程和已有的博客文章,如上述链接所示的博客,它们通常包含丰富的示例和实践经验,有助于深化理解。
结合网上的例子,在本地搭建并且跑通了的基于CXF的例子,soap webservice 和 restful webservice的混搭模式. 依赖cxf 3.0.4 测试工具SOAPUI 5.0 服务器 tomcat 7 浏览器 chrome
CXF会自动处理与SOAP消息的交互。 3. **WSDL(Web Service Description Language)**:WSDL文件描述了服务的接口、消息格式、操作以及如何调用这些服务。CXF可以通过注解或XML配置文件自动生成WSDL。 4. **部署...
以上步骤展示了如何在CXF客户端中添加SOAP Header,这个过程涉及到CXF客户端的配置、自定义Header处理以及服务调用。通过这样的方式,我们可以灵活地控制SOAP请求中的Header信息,满足各种服务交互的需求。记得根据...
安装完成后,可以使用SOAP UI等工具发送带有自定义SOAP头的请求,以测试CXF服务是否能够正确处理和验证头部信息。 综上所述,通过Apache CXF提供的Interceptor机制,我们可以方便地在SOAP消息中添加、读取和验证...
在提供的压缩包文件“cxf-ws-restful-spring-server”中,包含了使用CXF、SOAP和RESTful的示例项目。通过访问“http://localhost:8080/cxf-ws-restful-spring-server/ws63”,我们可以看到这些服务的实际运行效果。...
标题“使用CXF实现带header的soap服务”指的是在Java环境中,通过Apache CXF框架创建一个SOAP(简单对象访问协议)服务,同时处理带有HTTP头部信息的请求。Apache CXF是一个开源的服务框架,它允许开发者构建和消费...
2. **角色和权限**:除了基本的用户名密码验证外,还可以结合角色和权限系统,为不同的用户提供不同级别的访问权限。 3. **证书认证**:除了用户名和密码,也可以使用X.509证书进行双向认证,提供更高级别的安全性...
- CXF支持SOAP 1.1和1.2版本,提供了完整的SOAP处理能力,包括消息编码、处理WS-Security等。 - 使用CXF,开发者可以通过JAX-WS(Java API for XML Web Services)来创建SOAP服务。JAX-WS是Java中定义Web服务的...