加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

cxf WebService整理

发布时间:2020-12-16 21:51:54 所属栏目:安全 来源:网络整理
导读:项目中需要用到CXF做WS处理,花点时间对其有个简单认识,主要是在安全认证以及日志记录和异常处理这块有要求控制。 安全认证采用的是WSS4J,日志记录和异常处理采用拦截器控制, 资源下载: 客户端和服务端都点这 服务端 整体架构. 至于webservice的配置可以

项目中需要用到CXF做WS处理,花点时间对其有个简单认识,主要是在安全认证以及日志记录和异常处理这块有要求控制。

安全认证采用的是WSS4J,日志记录和异常处理采用拦截器控制,


资源下载:客户端和服务端都点这


服务端

整体架构.


至于webservice的配置可以参考其他文档,

服务接口

[java]? view plain ?copy
?

在CODE上查看代码片

派生到我的代码片

  1. package?com.cxfdemo.ws.service;??
  2. ??
  3. import?java.util.List;??
  4. import?javax.jws.WebParam;??
  5. import?javax.jws.WebResult;??
  6. import?javax.jws.WebService;??
  7. import?com.cxfdemo.ws.service.model.Resume;??
  8. import?com.cxfdemo.ws.service.model.User;??
  9. ??
  10. @WebService??
  11. public?interface?HelloWorld?{??
  12. ????@WebResult(name?=?"String")??
  13. ????public?String?sayHi(@WebParam(name="text")String?text);??
  14. ??????
  15. ????@WebResult(name?=?"user")??
  16. ????public?User?getUser(@WebParam(name="id")String?id);??
  17. ??????
  18. public?List<User>?getAllUsers();??
  19. void?saveUser(@WebParam(name="id")String?id,???
  20. ????????????@WebParam(name="name")String?name,???
  21. ????????????@WebParam(name="sex")int?sex);??
  22. ????/**?
  23. ?????*?客户端的ObjectFactory的createUser方法的参数必须和User的构造函数的参数一致?
  24. ?????*?<p>?
  25. ?????*?如客户端中需要用到new?User("id","name",1)构造User对象时?
  26. ?????*??
  27. ?????*?需要在ObjectFactory中加入?
  28. ?????*??public?User?createUser(String?id,String?name,int?sex)?{?
  29. ?????*??????return?new?User(id,name,sex);?
  30. ?????*??}?
  31. ?????*?</p>?
  32. ?????*?@param?user?
  33. ?????*/??
  34. void?saveUsers(@WebParam(name="user")User?user);??
  35. public?String?saveResumes(@WebParam(name="resume")Resume?resume);???
  36. }??


服务实现

其中关于文件传输采用二进制方式.

有2点是必须配置的。

1.传输对象中含有DataHandler 属性

@XmlMimeType("application/octet-stream")
private DataHandler dataHandler;

2.服务发布时协议规定

<!-- 文件传送必须协议 -->
<jaxws:properties>
? ? ? ??<entry key="mtom-enabled" value="true"/> ?
</jaxws:properties>

spring配置

[html]? view plain ?copy
?

在CODE上查看代码片

派生到我的代码片

    <import?resource="classpath:META-INF/cxf/cxf.xml"?/>??
  1. ????import?resource="classpath:META-INF/cxf/cxf-extension-soap.xml"?/>??
  2. ????import?resource="classpath:META-INF/cxf/cxf-servlet.xml"? ??????
  3. ????<!--?设置密码bean?-->??
  4. bean?id="serverPasswordCallback"?class="com.cxfdemo.ws.service.ServerPasswordCallback"></bean>??
  5. ??????
  6. ????<!--?WSS4J密码校验?-->??
  7. bean?id="wss4jInInterceptor"?class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">??
  8. ????????constructor-arg ????????????map ????????????????<!--?用户认证(明文密码)?-->??
  9. ????????????????entry?key="action"?value="UsernameToken"? ????????????????entry?key="passwordType"?value="PasswordText"?/><!--?明文?密文采用PasswordDigest-->??
  10. entry?key="passwordCallbackRef"?value-ref="serverPasswordCallback"? ???????????? ???????? ??
  11. <!--?发布服务?-->??
  12. jaxws:endpoint?id="helloWorld"?address="/helloWorld"??
  13. ????????implementor="com.cxfdemo.ws.service.HelloWorldService" ????????<!--?文件传送必须协议?-->??
  14. jaxws:propertiesentry?key="mtom-enabled"?value="true"/>????
  15. <!--?输入拦截器?-->??
  16. jaxws:inInterceptorsref?bean="wss4jInInterceptor"? ????????????<!--?日志打印?-->??
  17. bean?class="org.apache.cxf.interceptor.LoggingInInterceptor"?<!--?正常输出拦截器?-->??
  18. jaxws:outInterceptorsbean?class="com.cxfdemo.ws.service.interceptor.ErrorHandlerInterceptor"<!--?错误输出拦截器?-->??
  19. jaxws:outFaultInterceptorsjaxws:endpointjaxws:endpoint?id="updateFile"?address="/updateFile"??
  20. ????????implementor="com.cxfdemo.ws.service.UpdateFileService">????
  21. entry?key="mtom-enabled"?value="true"?/>????
  22. >???
  23. <!--?全局配置?-->??
  24. ????<!--?cxf:buscxf:featurescxf:logging?>?-->??

采用的是jaxws:endpoint发布服务,至于其他方式,这里就不描述了,关于WSS4J的文章,网上也有很多。

服务端CallbackHandler配置

其实密码验证的工作是交给了WSS4JInInterceptor来处理的。

下面是一次错误密码的异常信息。


从异常堆栈中看出密码校验在UsernameTokenValidator中处理。源码如下。
日志记录拦截器
可根据是否含有错误原因或错误信息分辨出当前此次服务请求成功与否。
一次密码错误的日志信息


请求信息为:
?<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" soap:mustUnderstand="1"><wsse:UsernameToken wsu:Id="UsernameToken-CF676781B956C77EB214127352680991"><wsse:Username>client</wsse:Username><wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">clientpass1</wsse:Password></wsse:UsernameToken></wsse:Security></SOAP-ENV:Header><soap:Body><ns2:saveUsers xmlns:ns2="http://service.ws.cxfdemo.com/"><user><collections>11dfdfd</collections><collections>22dfdfd</collections><collections>33dfdfd</collections><id>id</id><map><entry><key>44</key><value>333</value></entry><entry><key>55</key><value>333</value></entry><entry><key>22</key><value>333</value></entry><entry><key>33</key><value>333</value></entry><entry><key>11</key><value>333</value></entry></map><name>name</name><sex>2</sex></user></ns2:saveUsers></soap:Body></soap:Envelope>
soapUI配置
Eclipse的插件地址:http://www.soapui.org/eclipse/update

客服端

采用wsdl2java?生成的客户端。
密码也是用WSS4JOutInterceptor拦截设置的。
copy
? bean?id="clientPasswordCallback"?class="com.cxfdemo.ws.client.ClientPasswordCallback"bean?id="wss4jOutInterceptor"?class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor"entry?key="action"?value="UsernameToken"entry?key="user"?value="client"entry?key="passwordType"?value="PasswordText"entry?key="passwordCallbackRef"?value-ref="clientPasswordCallback"/>???
  • jaxws:client?id="client"?address="http://localhost:8888/CXFDemo/webservice/helloWorld"??
  • ????????serviceClass="com.cxfdemo.ws.service.HelloWorld"bean?class="org.apache.cxf.interceptor.LoggingOutInterceptor"?ref?bean="wss4jOutInterceptor"jaxws:clientjaxws:client?id="updateFile"?address="http://localhost:8888/CXFDemo/webservice/updateFile"??
  • ????????serviceClass="com.cxfdemo.ws.service.HelloWorld"<!--?对所有的服务配置超时机制???只对服务名为{http://service.ws.cxfdemo.com/}HelloWorldService的服务生效.???-->??
  • http-conf:conduit?name="*.http-conduit">?????????
  • ????????<!--?ConnectionTimeout获取连接超时???ReceiveTimeout获取结果超时-->??
  • http-conf:client?ConnectionTimeout="15000"?ReceiveTimeout="30000"http-conf:conduit>??


  • java代码控制