為什麼設計攔截器?
1.為了在webservice請求過程中,能動態操作請求和響應數據,CXF設計了攔截器
攔截器分類:
1.按所處的位置分:服務器端攔截器,客戶端攔截器。
2.按消息的方向分:入攔截器,出攔截器。
3.按定義者分:系統攔截器,自定義攔截器。
客戶端添加日志攔截器
package com.client.interceptor;
import java.util.List;
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 AddUserInterceptor extends AbstractPhaseInterceptor<SoapMessage>{
private String name;
private String password;
/**
*
* @param name
* @param password
*/
public AddUserInterceptor(String name,String password) {
super(Phase.PRE_PROTOCOL);//准備協議化時攔截
// TODO Auto-generated constructor stub
this.name=name;
this.password=password;
}
@Override
public void handleMessage(SoapMessage msg) throws Fault {
// TODO Auto-generated method stub
List<Header> headers = msg.getHeaders();
Document document = DOMUtils.createDocument();
Element rootEle = document.createElement("apple");
Element nameEle = document.createElement("name");
nameEle.setTextContent(name);
rootEle.appendChild(nameEle);
Element passwordEle = document.createElement("password");
passwordEle.setTextContent(password);
rootEle.appendChild(passwordEle);
headers.add(new Header(new QName("apple"), rootEle));
System.out.println("client handMwssage()....");
}
}
服務器端攔截器:
package com.service.interceptor;
import javax.xml.namespace.QName;
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 CheckUser extends AbstractPhaseInterceptor<SoapMessage>{
public CheckUser() {
super(Phase.PRE_PROTOCOL);
// TODO Auto-generated constructor stub
}
/*
<Envelope>
<head>
<apple>
<name>bo ram</name>
<password>520</password>
<apple>
</head>
<Body>
<favorite>
<arg0>Tara</arg0>
<favorite>
</Body>
</Envelope>
*/
@Override
public void handleMessage(SoapMessage message) throws Fault {
// TODO Auto-generated method stub
Header header = message.getHeader(new QName("apple"));
if(header!=null){
Element appleEle=(Element) header.getObject();
String name = appleEle.getElementsByTagName("name").item(0).getTextContent();
String password = appleEle.getElementsByTagName("password").item(0).getTextContent();
if("bo ram".equals(name)&&"520".equals(password)){
System.out.println("Server 通過攔截器");
return;
}
}
System.out.println("server 沒有通過攔截器。。。。。");
throw new Fault(new Exception("請求需要一個正確的用戶名和密碼"));
}
}
客戶端
package com.cxf_client.client;
import java.util.List;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.message.Message;
import com.client.interceptor.AddUserInterceptor;
import com.client.simple3.Simple;
import com.client.simple3.SimpleimplService;
public class Simpleclient2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
SimpleimplService simpleimplService = new SimpleimplService();
Simple simpleimplPort = simpleimplService.getSimpleimplPort();
//發送請求的客戶端數據
Client client = ClientProxy.getClient(simpleimplPort);
//客戶端出攔截器
List<Interceptor<? extends Message>> outInterceptors = client.getOutInterceptors();
outInterceptors.add(new AddUserInterceptor("bo ram", "520"));
// //客戶端入攔截器
// List<Interceptor<? extends Message>> inInterceptors = client.getInInterceptors();
// inInterceptors.add(new LoggingInInterceptor());
String favorite = simpleimplPort.favorite("Tara");
System.out.println(favorite);
}
}
服務端
package com.service.server;
import java.util.List;
import javax.xml.ws.Endpoint;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws22.EndpointImpl;
import org.apache.cxf.message.Message;
import com.service.impl.Simpleimpl;
import com.service.interceptor.CheckUser;
public class SimpleServer2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String address="http://localhost:8848/simpleserver/simple";
Endpoint publish = Endpoint.publish(address, new Simpleimpl());
EndpointImpl endpointimpl=(EndpointImpl) publish;
//服務端入攔截器
List<Interceptor<? extends Message>> inInterceptors = endpointimpl.getInInterceptors();
inInterceptors.add(new CheckUser());
// //服務端出攔截器
// List<Interceptor<? extends Message>> outInterceptors = endpointimpl.getOutInterceptors();
// outInterceptors.add(new LoggingOutInterceptor());
System.out.println("published");
}
}