要首先以有个接口:
@WebService
public interface MyWebService {
int add(int a, int b);
}
实现类
@WebService(endpointInterface="com.sg.service.MyWebService",serviceName="MyService")
public class MyWebserviceImpl implements MyWebService {
@Override
public int add(int a, int b) {
System.out.println(a+"+"+b+"="+(a+b));
return a+b;
}
}
发布服务端:
public class ServiceTest {
public static void main(String[] args) {
System.out.println("service start................");
MyWebserviceImpl myWebserviceImpl = new MyWebserviceImpl();
String address = "http://localhost:8089/myService";
EndpointImpl endpointImpl = (EndpointImpl) Endpoint.publish(address, myWebserviceImpl);
System.out.println("service end ..............");
//日志进来的日志拦截器
endpointImpl.getOutInterceptors().add(new LoggingOutInterceptor());
//出去的
endpointImpl.getInInterceptors().add(new LoggingInInterceptor());
}
}
客户端:
//客户端
public class ClientTest {
public static void main(String[] args) {
//对应服务器端实现类
//@WebService(endpointInterface="com.sg.service.MyWebService",serviceName="MyService")
MyService myService = new MyService();
//获取一个接口:服务器端的代理接口
MyWebService myWebService = myService.getMyWebserviceImplPort();
//获取cxf客户端服务类 通过cxf客户端代理类来获取
//传入参数是:代理webservice服务端口
Client client = ClientProxy.getClient(myWebService);
//进入时日志记录
client.getInInterceptors().add(new LoggingInInterceptor());
//响应时日志记录
client.getOutInterceptors().add(new LoggingOutInterceptor());
//用户名 权限验证
client.getOutInterceptors().add(new AddHeaderInterceptor("admin", "123456"));
int add = myWebService.add(1, 1);
System.out.println("add : "+add);
}
}
定义服务端拦截器:
package com.sg.service;
import java.util.List;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Element;
//服务器 验证权限
public class AuthInterceptor extends AbstractPhaseInterceptor<SoapMessage>{
public AuthInterceptor(){
super(Phase.PRE_INVOKE);
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
List<Header> headers = message.getHeaders();
//日过客户端没有传入SOAP包头文件时
if (headers == null || headers.size() == 0) {
//return 在这里不能实用 是错误的使用
//没有权限的时候 怎样告诉客户端没有权限?抛异常
throw new Fault(new IllegalAccessException("SAOP 包文件没有....."));
}
Header header = headers.get(0);
System.out.println(header.getObject().getClass()+"******************************");
Element element = (Element)header.getObject();
String username = element.getElementsByTagName("username").item(0).getTextContent();
String password = element.getElementsByTagName("password").item(0).getTextContent();
System.out.println("***************************************************");
if ("admin".equals(username) && "123456".equals(password)) {
//验证成功
//处理其他的业务逻辑 : 扣费
System.out.println("===========处理其他的业务逻辑 : 扣费===========");
}else {
//验证失败
throw new Fault(new RuntimeException("访问服务的用户名 或密码错误...."));
}
}
}
定义客户端拦截器:
package com.sg.client;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
//客户端拦截器
public class AddHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
private String username;
private String password;
public AddHeaderInterceptor(String username,String password){
//告诉拦截器什么时机调用拦截器
super(Phase.PREPARE_SEND);
this.username = username;
this.password = password;
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
//添加soap头信息 包含用户名 和 密码
/**
* <auth><username>admin</username><password>123456</password></auth>
*/
Document document = DOMUtils.createDocument();
Element authElement = document.createElement("auth");
Element username = document.createElement("username");
username.setTextContent(this.username);
authElement.appendChild(username);
Element password = document.createElement("password");
password.setTextContent(this.password);
authElement.appendChild(password);
//第二个参数必须是Element对象
Header header = new Header(new QName("com.sg.service"), authElement);
message.getHeaders().add(header);
}
}
测试结果显示:
客户端日志信息:
2013-1-24 23:44:14 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromWSDL
信息: Creating Service {http://service.sg.com/}MyService from WSDL: http://localhost:8089/myService?wsdl
2013-1-24 23:44:15 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Outbound Message
---------------------------
ID: 1
Address: http://localhost:8089/myService
Encoding: UTF-8
Content-Type: text/xml
Headers: {Accept=[*/*], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header>
<auth>
<username>admin</username>
<password>123456</password>
</auth>
</soap:Header><soap:Body><ns2:add xmlns:ns2="http://service.sg.com/"><arg0>1</arg0><arg1>1</arg1></ns2:add></soap:Body></soap:Envelope>
--------------------------------------
2013-1-24 23:44:15 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Inbound Message
----------------------------
ID: 1
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {Content-Length=[197], content-type=[text/xml;charset=UTF-8], Server=[Jetty(7.4.2.v20110526)]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:addResponse
xmlns:ns2="http://service.sg.com/"><return>2</return></ns2:addResponse></soap:Body></soap:Envelope>
--------------------------------------
add : 2
服务器端日志信息:
2013-1-24 23:44:14 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Inbound Message
----------------------------
ID: 1
Address: http://localhost:8089/myService?wsdl
Http-Method: GET
Content-Type: text/xml
Headers: {Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], content-type=[text/xml], Host=[localhost:8089], Pragma=[no-cache], User-Agent=[Apache CXF
2.4.1]}
--------------------------------------
2013-1-24 23:44:15 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Inbound Message
----------------------------
ID: 2
Address: http://localhost:8089/myService
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml; charset=UTF-8
Headers: {Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], Content-Length=[284], content-type=[text/xml; charset=UTF-8], Host=[localhost:8089],
Pragma=[no-cache], SOAPAction=[""], User-Agent=[Apache CXF 2.4.1]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header>
<auth>
<username>admin</username>
<password>123456</password>
</auth>
</soap:Header><soap:Body><ns2:add xmlns:ns2="http://service.sg.com/"><arg0>1</arg0><arg1>1</arg1></ns2:add></soap:Body></soap:Envelope>
--------------------------------------
1+1=2
2013-1-24 23:44:15 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Outbound Message
---------------------------
ID: 2
Encoding: UTF-8
Content-Type: text/xml
Headers: {}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:addResponse
xmlns:ns2="http://service.sg.com/"><return>2</return></ns2:addResponse></soap:Body></soap:Envelope>
--------------------------------------
相关推荐
Web Service学习-CXF开发Web Service的权限控制(二)
webservice拦截器demo-服务端和调用端
13.为CXF与Spring整合发布WebService添加拦截器进行权限控制
webservice的cxf框架拦截器demo.rar
CXF使用EndpointImpl发布WebService加入拦截器
CXF发布WebService加入拦截器
本文根据java代理实现CXF拦截器异常时只能进入fault拦截器而不能继续向下执行的问题。 利用java代理让RMI具有拦截器的功能。
10.为CXF服务器端添加自定义拦截器进行权限检查
11.为CXF客户端添加自定义拦截器完成权限控制
讲解了cxf实现拦截器的原因、核心API及使用方法
08.CXF拦截器的理论以及如何为CXF的客户端和服务器端添加拦截器
CXF 自定义拦截器实现的 webservice安全机制实例工程, 带jar包 ,代码注释详细 内有说明文档, 由于资源过大 ,所以客户端jar包 删除掉了, 只需要把服务端的jar 拷贝到 客户端即可 , 小弟刚刚研究完 CXF 安全 。...
实现了客户端和服务端,客户端添加header服务端获取验证!
其中配置了对传入请求的拦截器用以验证调用者身份 验证程序: WsServerAuthHandler. 这里只需要提供调用者应该使用的正确的口令. 是否和调用者实际传入的口令一致,由cxf完成. web.xml ------------------------- ...
这里少了一个类,是根据实体类生成xml的文件下载地址为:http://download.csdn.net/detail/qq_14996421/9495688
CXF对Interceptor拦截器的支持 CXF WebService中传递复杂类型对象 CXF整合Spring ANT工具快速构建、部署工程
完整可用的spring整合CXF示例项目,包括服务发布端和调用端两个项目,包括CXF拦截器的实现的简单的授权校验
CXF+Spring+自定义拦截器 webservice源码下载
Apache Cxf WebService整合Spring 处理Map、非javabean式的复合类等CXF无法自动转化的类型 CXF为服务器端和客户端添加自定义拦截器进行权限检查验证并且控制台打印日志
wsdl解析,soap消息格式 输入输出参数的注解,Web服务上下文 Jax—Ws异常处理,MTOM文件传输 Jax-Rs,Web服务生命周期 Cxf集成Spring 安全机制(用户命令+数字签名+混合验证) Cxf拦截器特征机制,Jax-Rs异步调用