1. 程式人生 > >Java 呼叫Web service 新增認證頭(soapenv:Header)

Java 呼叫Web service 新增認證頭(soapenv:Header)

前言

有時候呼叫web service 會出現

Message does not conform to configured policy [ AuthenticationTokenPolicy(S) ]:  No Security Header found

這樣的錯誤。

以在 soapui 呼叫的結果來看, 會出現如下的返回

出現這種錯誤的原因 是webservice 的服務端需要提供 soap 認證的表頭。

舉例來說, 可能需要加上如下的認證頭:

        <soapenv:Header>
          <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">
            <wsse:UsernameToken>
              <wsse:Username>UserName</wsse:Username>
              <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">Password</wsse:Password>
            </wsse:UsernameToken>
          </wsse:Security>
        </soapenv:Header>
(這個細部的格式和服務端的要求有關, 具體的username和pass也是服務端提供的)

在sopaui 呼叫的時候, 加上類似, 就能呼叫成功了。

在soapui 呼叫, 可以用以上方式來做。在把wsdl 轉為java 後, 又該如何加上認證的頭資訊呢?

cxf 加上認證頭

(以上的認證頭, 比較接近cxf 的呼叫方式。)

如果使用的是cxf生產的客戶端的程式碼。

在 _Client 呼叫的時候加上 如下程式碼:(在方法呼叫的程式碼之前)

	    Map<String, Object> props = new HashMap<String, Object>();
	    props.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);	  
	    props.put(WSHandlerConstants.PASSWORD_TYPE,WSConstants.PW_TEXT);
	    props.put(WSHandlerConstants.USER, "UserName");
	    props.put(WSHandlerConstants.PW_CALLBACK_CLASS, PasswordHandler.class.getName());
	    WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(props);
	    Client client = ClientProxy.getClient(port);
	    client.getOutInterceptors().add(wssOut);

在client 的java 檔案中, 新增以下內部類
	public static class PasswordHandler implements CallbackHandler
	{
	    public void handle(javax.security.auth.callback.Callback[] callbacks) {
	        for (int i = 0; i < callbacks.length; i++) {
	            WSPasswordCallback pc = (WSPasswordCallback)callbacks[i];
	            pc.setPassword("password");
	        }
	    }

	}


Axis2 加上認證頭

針對以上的認證頭在axis2 產生的java 檔案中如何新增呢(Axis2自動產生的java 檔案並不會自動產生main的測試檔案, 需要自己寫。  XXXXProxy.java 這是供呼叫的類檔案。 不過這些和新增認證頭關係不大)

axis2會產生一個  XXXXPortBindingStub.java 的檔案。 這裡面的內容就是實際的方法體。

找到我們需要呼叫的那個方法體:

在方法呼叫之前,加入以下程式碼:

//Begin add for Header
        String AUTH_PREFIX = "wsse";
        String AUTH_NS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
         try{
            SOAPElement wsSecHeaderElm = soapFactory.createElement("Security", AUTH_PREFIX, AUTH_NS);        
            SOAPElement userNameTokenElm = soapFactory.createElement("UsernameToken",AUTH_PREFIX, AUTH_NS);          
            SOAPElement userNameElm = soapFactory.createElement("Username",AUTH_PREFIX, AUTH_NS);         
            SOAPElement passwdElm = soapFactory.createElement("Password",AUTH_PREFIX, AUTH_NS);                 
            passwdElm.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
          
	   userNameElm.addTextNode("vend_bmc01");
	   passwdElm.addTextNode("mediatek");
			
	  userNameTokenElm.addChildElement(userNameElm);
	  userNameTokenElm.addChildElement(passwdElm);
	  wsSecHeaderElm.addChildElement(userNameTokenElm);			
	  SOAPHeaderElement soapHeaderElement =  new SOAPHeaderElement(wsSecHeaderElm);
	  soapHeaderElement.setMustUnderstand(true);
	  _call.addHeader(soapHeaderElement);  
        }catch(Exception e)
        {
        	e.printStackTrace();
        }        
      //End add for Header
 
===》call method
       java.lang.Object _resp = _call.invoke(XXXX);

原理很簡單。 加上類似xml 的頭, _call_addHeader

加上之後,再觸發方法 _call.invoke

相關推薦

Java 呼叫Web service 新增認證soapenv:Header

前言有時候呼叫web service 會出現Message does not conform to configured policy [ AuthenticationTokenPolicy(S) ]:  No Security Header found 這樣的錯誤。以在 s

嵌入式linux網路程式設計,TCP、IP協議原理,wireshark抓包工具,乙太網Ethernet header,IP,TCP,三次握手,四次握手,UDP

文章目錄 1,wireshark抓包工具 1.1,wireshark安裝 1.2,wireshark啟動 1.2.1,出現錯誤警告 1.2.2,解決方案 2,常用除錯測試工具 3,TCP

Java RESTful Web ServiceIntellij+Tomcat+Jersey

很多教程都到上一步為止,但執行Tomcat的時候會發現,並不能提供服務,因為依賴並沒有拷貝到web的lib下。 在Project Structure->Artifacts選擇Output Layout下Available Elements下所有的包,然後右鍵加入到web-INF/lib。

JAVA開發Web Service幾種框架介紹

需求 驚人的 總線 cast pri web服務 希望 uil blank 在講Web Service開發服務時,需要介紹一個目前開發Web Service的幾個框架,分別為Axis,axis2,Xfire,CXF以及JWS(也就是前面所述的JAX-WS,這是Java

eclipse中java Dynamatic web的創建過程或者eclipse中jsp的創建或eclipse開發環境jdk,eclipse,tomcat的測試

alt 進行 lan .cn ges log image oct ips 1.啟動eclipse程序。 2.File-New->Dynamatic web project,如圖 3.右擊項目名-->new-->New jsp file---> 點

Java RESTful Web Service實戰(第2版)pdf

images rep 漸進 網盤下載 調優 一點 進一步 image ctf 下載地址:網盤下載 內容簡介本書系統、深度講解了如何基於Java標準規範實現REST風格的Web服務,由擁有10余年開發經驗的阿裏雲大數據架構師撰寫,第1版上市後廣獲贊譽,成為該領域的暢銷書。第

Web Service 部分內容簡述1

DC 感受 名詞解釋 其他 通訊 封裝 對象 sax 基於web 1、什麽是Web服務(web service)   Wb服務是一種可以用來解決跨網絡應用集成問題的開發模式,是基於網絡的、分布式的模塊化組件,它執行特定的任務遵守具體的技術規範,這些規範使得Web Ser

<<Java RESTful Web Service實戰>> 讀書筆記

protoc 交付 soap pro 內容 ica servlet容器 安全 soap協議 <<Java RESTful Web Service實戰>> 讀書筆記 第一章 JAX-RS2.0入門 REST (Representational

js呼叫Web Service方式

<!doctype html>   <html lang="en">    <head>     <meta cha

java呼叫命令提示符並返回結果中文無亂碼

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import

JAVA開發Web Service幾種框架介紹和選擇

下面分別介紹一個這幾種Web Service框架的基本概念1、JWS是Java語言對WebService服務的一種實現,用來開發和釋出服務。而從服務本身的角度來看JWS服務是沒有語言界限的。但是Java語言為Java開發者提供便捷釋出和呼叫WebService服務的一種途徑。2、Axis2是Apac

Java通過瀏覽器請求User-Agent獲取 瀏覽器型別,作業系統型別,手機機型

一:獲得瀏覽器請求頭中的User-Agent   ? 1 String ua = request.getHeader("User-Agent") 二:獲得瀏覽器型別,作業系統型別:(注意,UserAgent類在U

java傳統web專案新增maven管理jar包,log4j無法正常輸出日誌

背景   筆者最近在給公司一個老的web專案改造升級,專案使用springmvc+mybatis,由於專案比較久遠,沒有使用maven管理jar版本,有可能是當時開發任務比較緊迫,不同的同事在不同的時期放入了jar版本各不相同, 看到那麼多混亂的jar,真是操心。筆者曾花了大概半個下午的時間,把jar版本

Java Web 生成Word文件freemarker方式

首先在pom檔案中加入下面這個依賴(不是Maven專案的話,把jar包匯入專案即可) <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</ar

Web Service零碎基礎知識+採用CXF訪問呼叫Web Service服務

1. Web Service體系結構的三個角色 服務提供者(Service Provider):提供服務的平臺,就是服務的生產者。 服務請求者(Service Requester):服務的消費者,需要請求特定功能的企業,就是查詢和呼叫服務的客戶端應用程式

使用axis2呼叫web service

使用axis2生成客戶端程式碼 下載axis2 , 點選這裡, 選擇 Binary distribution 下載後解壓,解壓進入到bin目錄 執行命令生成客戶端程式碼 -uri: 後可以接wsd

建立Windows server時呼叫web service介面時的幾個問題

問題1:提供的 URI 方案“https”無效,應為“http”。 引數名: via 解決方案: 在app.config配置檔案中,搜尋“https”,把"Https”全部修改為“http”; <httpsTransport authenticationScheme="Bas

Java呼叫C++編寫的動態庫JNI

1. 在eclipse裡利用java建立一個類,在類中加入帶有native的方法(eclipse建立的類會自動新增class在bin目錄下) 2.利用javah命令生成本地方法的c++標頭檔案。進入到工程bin目錄下,按住shift,並右擊,選擇 “在此處開啟命令視窗”,進入命令視

利用JDK自帶工具構建一個簡單的Java SOAP Web Service

這兩天由於工作的某些原因,需要了解一些關於Web Service的知識,然後在網上看到了這麼一篇簡單的有點略微過時但是對於初次接觸Web Service的同學來說又很有必要了解的文章,於是自己嘗試著將文章翻譯過來。 A. 構造Web服務 1. 構造一個簡單的hello

WEB後臺--基於Token的WEB後臺登入認證機制並講解其他認證機制以及cookie和session機制

繼續這一個系列,基於Token的WEB後臺登入認證機制(並講解cookie和session機制)。每個後端不得不解決的認證問題。 本系列: 文章結構:(1)JWT(一種基於 token 的認證方案)介紹並介紹其他幾大認證機