日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

JAX-WS使用Handler实现简单的WebService权限验证

發布時間:2025/5/22 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAX-WS使用Handler实现简单的WebService权限验证 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  WebService如果涉及到安全保密或者使用權限的時候,WS-Security通常是最優選擇。WS-Security (Web服務安全)
包含了關于如何在WebService消息上保證完整性和機密性的規約,如何將簽名和加密頭加入SOAP消息。
不過WS-Security也有一些性能上的損耗,在信息保密要求不是很高的情況下,可以通過在SOAPHeader中添加簡單的校驗信息實現。
具體思路是客戶端調用需要認證的服務時,在SOAPHeader中添加授權信息(如用戶名、密碼或者序列號等)。
服務端收到請求,在SOAPHeader中校驗授權信息,校驗通過則執行請求,校驗不通過則返回錯誤提示。

客戶端發起請求在SOAPHeader中添加的授權數據格式如下

<auth xmlns="http://schemas.xmlsoap.org/soap/actor/next"> <username>admin</username> <password>admin</password> </auth>

服務端

服務端授權校驗 Handler

import java.util.Iterator; import java.util.Set;import javax.xml.namespace.QName; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPConstants; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPFault; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPMessage; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.handler.soap.SOAPHandler; import javax.xml.ws.handler.soap.SOAPMessageContext;import org.apache.cxf.interceptor.Fault; import org.w3c.dom.NodeList;/**** @author */ public class JaxServerAuthValidateHeader implements SOAPHandler<SOAPMessageContext> {@Overridepublic void close(MessageContext context) {}@Overridepublic boolean handleFault(SOAPMessageContext context) {return true;}@Overridepublic boolean handleMessage(SOAPMessageContext context) {// 判斷消息是輸入還是輸出boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);SOAPMessage soapMessage = context.getMessage();if (!isRequest) {SOAPHeader soapHeader = null;try {SOAPEnvelope soapEnv = soapMessage.getSOAPPart().getEnvelope();soapHeader = soapEnv.getHeader();} catch (SOAPException e) {throw new Fault(new Exception("服務器異常!"));}if (soapHeader == null) {validateFail(soapMessage, "無 Soap Header 頭信息!");return false;}// add an node named "auth"QName qname = new QName(SOAPConstants.URI_SOAP_ACTOR_NEXT, "auth");Iterator<?> iterator = soapHeader.getChildElements(qname);SOAPElement auth = null;if (iterator.hasNext()) {// 獲取authauth = (SOAPElement) iterator.next();}// 如果授權信息元素不存在,提示錯誤if (auth == null) {validateFail(soapMessage, "無授權信息!");return false;}NodeList nameList = auth.getElementsByTagName("username");NodeList pwdList = auth.getElementsByTagName("password");if (nameList == null || nameList.getLength() <= 0 || pwdList == null || pwdList.getLength() <= 0) {validateFail(soapMessage, "授權信息格式錯誤!");return false;}String username = nameList.item(0).getTextContent();String password = pwdList.item(0).getTextContent();if (!"admin".equals(username) || !"admin".equals(password)) {validateFail(soapMessage, "授權信息格式錯誤!");return false;}}System.out.println(isRequest ? "服務端響應:" : "服務端接收:");System.out.println("\r\n");return true;}@Overridepublic Set<QName> getHeaders() {return null;}/*** 授權校驗失敗,在SOAPBody中添加SOAPFault* * @param message*/private void validateFail(SOAPMessage soapMessage, String faultString) {try {SOAPEnvelope envelop = soapMessage.getSOAPPart().getEnvelope();envelop.getHeader().detachNode();envelop.addHeader();envelop.getBody().detachNode();SOAPBody body = envelop.addBody();SOAPFault fault = body.getFault();if (fault == null) {fault = body.addFault();}fault.setFaultString(faultString);soapMessage.saveChanges();} catch (SOAPException e) {e.printStackTrace();}}}

服務端Handler配置文件handler-chain.xml?

<?xml version="1.0" encoding="UTF-8"?> <javaee:handler-chains xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <javaee:handler-chain> <javaee:handler> <javaee:handler-class>com.server.handler.JaxServerAuthValidateHeader</javaee:handler-class> </javaee:handler> </javaee:handler-chain> </javaee:handler-chains>

服務端的Service中添加Handler配置文件?

import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.xml.bind.annotation.XmlSeeAlso; import javax.xml.ws.RequestWrapper; import javax.xml.ws.ResponseWrapper;/*** This class was generated by Apache CXF 3.2.1* 2017-12-01T14:12:00.085+08:00* Generated source version: 3.2.1* */ @WebService(targetNamespace = "http://tempuri.org/", name = "AExampleDemoWebService") @HandlerChain(file="handler-chain.xml") public interface AExampleDemoWebService {@WebMethod@WebResult(name = "single", targetNamespace = "")public java.lang.String querySingle(@WebParam(name = "single", targetNamespace = "http://tempuri.org/")java.lang.String single);}

服務端的Service 實現類

import java.util.ArrayList; import java.util.List;import cn.evun.iwm.receive.soap.service.AExampleDemoWebService; import cn.evun.iwm.receive.soap.struc.sample.InputParam; import cn.evun.iwm.receive.soap.struc.sample.OutputParam;@javax.jws.WebService(serviceName = "aexampleDemoWebService", portName = "Sample", targetNamespace = "http://tempuri.org/", endpointInterface = "cn.soap.service.AExampleDemoWebService") public class AExampleDemoWebServiceImpl implements AExampleDemoWebService {@Overridepublic String querySingle(String input) {return "success";}}

客戶端

客戶端添加授權Handler

import java.io.IOException; import java.util.Set;import javax.xml.namespace.QName; import javax.xml.soap.SOAPConstants; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPMessage; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.handler.soap.SOAPHandler; import javax.xml.ws.handler.soap.SOAPMessageContext;public class JaxWsClientHandler implements SOAPHandler<SOAPMessageContext> {@Overridepublic boolean handleMessage(SOAPMessageContext context) {// 判斷消息是請求還是響應Boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);SOAPMessage soapMessage = context.getMessage();if (isRequest) {try {SOAPHeader soapHeader = soapMessage.getSOAPHeader(); if (soapHeader == null) { soapHeader = soapMessage.getSOAPPart().getEnvelope().addHeader(); } // add an node named "auth"QName qname = new QName(SOAPConstants.URI_SOAP_ACTOR_NEXT, "auth");SOAPElement auth = soapHeader.addChildElement(qname);SOAPElement name = auth.addChildElement("username");name.addTextNode("admin");SOAPElement password = auth.addChildElement("password");password.addTextNode("admin");soapMessage.saveChanges();// tracking soapMessage.writeTo(System.out);} catch (SOAPException e) {System.err.println(e);} catch (IOException e) {System.err.println(e);}}return true;}@Overridepublic boolean handleFault(SOAPMessageContext context) {return false;}@Overridepublic void close(MessageContext context) {}@Overridepublic Set<QName> getHeaders() {return null;}}

客戶端Handler配置文件handler-chain.xml

<?xml version="1.0" encoding="UTF-8"?> <javaee:handler-chains xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <javaee:handler-chain> <javaee:handler> <javaee:handler-class>com.client.handler.JaxWsClientHandler</javaee:handler-class> </javaee:handler> </javaee:handler-chain> </javaee:handler-chains>

客戶端的Service中添加Handler配置文件

import java.net.MalformedURLException; import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.WebEndpoint; import javax.xml.ws.WebServiceClient; import javax.xml.ws.WebServiceFeature;import javax.xml.ws.Service;/*** This class was generated by Apache CXF 3.2.1* 2017-12-01T14:12:00.117+08:00* Generated source version: 3.2.1* */ @WebServiceClient(name = "aexampleDemoWebService", wsdlLocation = "http://localhost:8090/service/Sample?wsdl",targetNamespace = "http://tempuri.org/") @HandlerChain(file="handler-chain.xml") public class AexampleDemoWebServiceSoap extends Service {public final static URL WSDL_LOCATION;public final static QName SERVICE = new QName("http://tempuri.org/", "aexampleDemoWebService");public final static QName Sample = new QName("http://tempuri.org/", "Sample");static {URL url = null;try {url = new URL("http://localhost:8090/service/Sample?wsdl");} catch (MalformedURLException e) {java.util.logging.Logger.getLogger(AexampleDemoWebServiceSoap.class.getName()).log(java.util.logging.Level.INFO, "Can not initialize the default wsdl from {0}", "http://localhost:8090/service/Sample?wsdl");}WSDL_LOCATION = url;}public AexampleDemoWebServiceSoap(URL wsdlLocation) {super(wsdlLocation, SERVICE);}public AexampleDemoWebServiceSoap(URL wsdlLocation, QName serviceName) {super(wsdlLocation, serviceName);}public AexampleDemoWebServiceSoap() {super(WSDL_LOCATION, SERVICE);}public AexampleDemoWebServiceSoap(WebServiceFeature ... features) {super(WSDL_LOCATION, SERVICE, features);}public AexampleDemoWebServiceSoap(URL wsdlLocation, WebServiceFeature ... features) {super(wsdlLocation, SERVICE, features);}public AexampleDemoWebServiceSoap(URL wsdlLocation, QName serviceName, WebServiceFeature ... features) {super(wsdlLocation, serviceName, features);} /**** @return* returns AExampleDemoWebService*/@WebEndpoint(name = "Sample")public AExampleDemoWebService getSample() {return super.getPort(Sample, AExampleDemoWebService.class);}/*** * @param features* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy.
   *   Supported features not in the <code>features</code> parameter will have their default values.*
@return* returns AExampleDemoWebService*/@WebEndpoint(name = "Sample")public AExampleDemoWebService getSample(WebServiceFeature... features) {return super.getPort(Sample, AExampleDemoWebService.class, features);}}

客戶端發起請求

QName SERVICE_NAME = new QName("http://tempuri.org/", "aexampleDemoWebService"); URL url = new URL("http://localhost:8090/service/Sample?wsdl"); AexampleDemoWebServiceSoap ss = new AexampleDemoWebServiceSoap(wsdlURL, SERVICE_NAME); AExampleDemoWebService port = ss.getSample(); port.querySingle("1111");

@HandlerChain 注解 替代方式

  客戶端 ?通過 HandlerReolver 代替?@HandlerChain 注解 導入?Handler 配置文件

  handler-chain配置文件對所有的請求都添加授權驗證信息,有些時候不是所有的請求都需要添加授權驗證,HandlerResolver提供了在編程時添加Handler的方法,可以用HandlerResolver給需要授權的接口添加Handler。

QName SERVICE_NAME = new QName("http://tempuri.org/", "aexampleDemoWebService"); URL url = new URL("http://localhost:8090/service/Sample?wsdl"); AexampleDemoWebServiceSoap ss = new AexampleDemoWebServiceSoap(wsdlURL, SERVICE_NAME); //通過HandlerResolver添加Handler ss.setHandlerResolver(new HandlerResolver(){ @Override @SuppressWarnings("rawtypes") public List<Handler> getHandlerChain(PortInfo portInfo) { List<Handler> handlerChain = new ArrayList<Handler>(); handlerChain.add(new JaxWsClientHandler()); return handlerChain; } }); AExampleDemoWebService port = ss.getSample(); port.querySingle("2222");

服務端?@HandlerChain 注解替代?

  服務發布時服務端通過繼承至?Endpoint 實現類?EndpointImpl 的?setHandlers 方法添加頭部信息?代替?@HandlerChain 注解?導入?Handler 配置文件

import java.util.ArrayList; import java.util.List;import javax.xml.ws.Endpoint; import javax.xml.ws.handler.Handler;import org.apache.cxf.Bus; import org.apache.cxf.bus.spring.SpringBus; import org.apache.cxf.interceptor.Interceptor; import org.apache.cxf.jaxws.EndpointImpl; import org.apache.cxf.message.Message; import org.apache.cxf.transport.servlet.CXFServlet; import org.springframework.boot.context.embedded.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;@Configuration public class CXFConfig {@Beanpublic ServletRegistrationBean dispatcherServlet() {return new ServletRegistrationBean(new CXFServlet(), "/service/*");}@Bean(name = Bus.DEFAULT_BUS_ID)public SpringBus springBus() {return new SpringBus();}@Beanpublic AExampleDemoWebServiceImpl aExampleDemoWebServiceImpl() {return new AExampleDemoWebServiceImpl();}@Beanpublic Endpoint endpointWebServiceSampleImpl() {EndpointImpl endpoint = new EndpointImpl(springBus(), aExampleDemoWebServiceImpl());// SOAPHandler 方式 @SuppressWarnings("rawtypes")List<Handler> handlers = new ArrayList<>();handlers.add(new JaxServerAuthValidateHeader());endpoint.setHandlers(handlers);endpoint.publish("/Sample");return endpoint;}}

當使用替代方式添加頭部信息的時候就不需要使用?@HandlerChain 注解?

轉載于:https://www.cnblogs.com/rinack/p/7943164.html

總結

以上是生活随笔為你收集整理的JAX-WS使用Handler实现简单的WebService权限验证的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久av综合网 | 男人天堂综合网 | 亚洲jlzzjizz少妇 | 极品白嫩的小少妇 | 熟女俱乐部五十路六十路av | 亚洲aaa级| av网站在线观看不卡 | 成人在线看片 | 中文字幕123区 | 高清av免费观看 | 人人妻人人澡人人爽欧美一区 | 精品国产乱码久久久久久郑州公司 | 中文在线a∨在线 | 国产一区免费 | 少妇人妻无码专区视频 | 国产白丝一区二区三区 | 亚洲福利一区二区三区 | 熟女少妇a性色生活片毛片 亚洲伊人成人网 | 国产精品久久久久影院老司 | 入禽太深免费视频 | 自拍偷拍视频网站 | 一区二区三区精品国产 | 国产精品自拍偷拍视频 | 亚洲不卡影院 | 国产免费又爽又色又粗视频 | 精品国产精品三级精品av网址 | 亚洲 小说 欧美 激情 另类 | 国产精品黄色av | 日韩女人性猛交 | 久草福利资源 | 超碰com| 亚洲最大在线观看 | 欧美日韩123区 | 大屁股白浆一区二区 | 久久精品人人 | 亚洲国产专区 | 国内成人综合 | www.黄色网址| 先锋影音中文字幕 | 亚洲欧美激情精品一区二区 | 人妻丰满熟妇av无码区hd | 国产男男gay网站 | 91视频网页 | 亚洲深夜在线 | av女优天堂在线观看 | 欧洲久久久久 | 日本免费一级片 | 亚洲生活片 | 在线不卡 | 好吊妞视频一区二区三区 | 在线观看av片| 久久伊人av| 献给魔王伊伏洛基亚吧动漫在线观看 | 欧美精品在线观看视频 | 久久夜色精品亚洲 | 夜色资源网 | 亚洲一| 性猛交富婆╳xxx乱大交天津 | 91你懂的 | 嫩草视频一区二区三区 | 成人观看网站 | 国产福利91精品一区二区三区 | 精品视频无码一区二区三区 | 奇米影视一区二区 | 日韩免费二区 | a无一区二区三区 | 国产农村妇女精品一区 | 中文在线а√在线 | 琪琪色在线视频 | 精品成人一区二区三区久久精品 | 日本黄网在线观看 | 黄色片成人 | 日韩黄色影视 | 午夜污片| 色播av| 国内精品偷拍 | 国模婷婷| 国产成人啪精品 | 久久久久久电影 | 国产日韩第一页 | 美日韩在线视频 | 91av成人| 黄色av网站在线看 | 夜夜嗨av一区二区三区四区 | 亚洲美女操 | 香蕉视频97 | 三级免费网址 | 日韩乱码一区二区三区 | 国内自拍视频在线播放 | 久久国产精品毛片 | 五月婷婷激情在线 | 在线观看亚洲大片短视频 | 黄色av播放 | 天天超碰 | 97se在线视频 | 国产成人亚洲精品无码h在线 | 国产稀缺真实呦乱在线 | av在线浏览 | 亚洲自拍偷拍在线 |