CXF - 拦截器
2019獨角獸企業重金招聘Python工程師標準>>>
?
攔截器的實現
package org.shi.cxf.intecepter;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;/*** 自定義攔截器實現用戶名密碼等的攔截* @author xiaoshi**/ public class AuthInteceptor extends AbstractPhaseInterceptor<SoapMessage>{public AuthInteceptor() {super(Phase.PRE_INVOKE);//該攔截器將會 在 “調用之前” 攔截SOAP 消息}@Overridepublic void handleMessage(SoapMessage msg) throws Fault {System.out.println("------AuthInteceptor攔截到-----" + msg);List<Header> list = msg.getHeaders();if(list == null || list.size()<1) {throw new Fault(new IllegalArgumentException("用戶不合法,靜止訪問!"));}System.out.println(list.toString());}}?
然后用戶訪問的時候會被攔截到
?
? ?2 .客戶端自定義攔截器
package org.shi.cxf;import org.apache.cxf.endpoint.Client; import org.apache.cxf.frontend.ClientProxy; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.shi.cxf.interceptor.AddHeaderInterceptor; import org.shi.cxf.ws.HelloWorld; import org.shi.cxf.ws.impl.HelloWorldServiceName;/*** web service 客戶端 啟動方法* @author xiaoshi**/ public class WSClientStart {public static void main(String[] args) {HelloWorldServiceName servieFactory = new HelloWorldServiceName();//此處返回的只是遠程Web Service的代理;HelloWorld hw = servieFactory.getHelloWorldImplPort();//自定義攔截器實現請求攔截(就是out攔截)Client client = ClientProxy.getClient(hw);client.getOutInterceptors().add(new AddHeaderInterceptor("shiye","123"));//設置消息頭client.getOutInterceptors().add(new LoggingOutInterceptor());//打印消息請求System.out.println(hw.sayHi("施爺"));}}?
package org.shi.cxf.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 AddHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage>{private String userName;private String pwd;public AddHeaderInterceptor(String userName,String pwd) {super(Phase.PREPARE_SEND); //在準備發送時啟用攔截器this.pwd = pwd;this.userName = userName;}@Overridepublic void handleMessage(SoapMessage msg) throws Fault {List<Header> list = msg.getHeaders();//創建Document對象Document doc = DOMUtils.createDocument();Element element = doc.createElement("authHeader");//創建服務器端要求的參數類型格式Element idElement = doc.createElement("userName");idElement.setTextContent(userName);Element pwdElement = doc.createElement("pwd");pwdElement.setTextContent(pwd);element.appendChild(idElement);element.appendChild(pwdElement);Header header = new Header(new QName("auth"),element);list.add(header);//添加消息頭}}?
?
?
轉載于:https://my.oschina.net/u/3677987/blog/3027498
總結
- 上一篇: 【译】Typescript的类型(二)
- 下一篇: k8s实践7:ipvs结合iptable