1. 程式人生 > >[已解決]:java webservice 使用者驗證 (服務端 + 客戶端)

[已解決]:java webservice 使用者驗證 (服務端 + 客戶端)

說明:在網上找了一堆 handler驗證的東東,試驗了一下,沒成功。

現在換了一種方式:在 tomcat的配置檔案中新增使用者角色和使用者資訊

             然後在 webservice的專案配置檔案中增加對應的角色。從而達到 使用者驗證的目的。

開發環境: MyEclipse 10, Tomcat 7

參考:http://www.fengfly.com/plus/view-210099-1.html

先晒一下效果圖:


以下是具體操作過程:

一, Server端程式碼

二, Client端的程式碼 

三, Tomcat的配置檔案 及 Server端的配置

四,修改Client端呼叫webservice的方法

================================================

一, Server端程式碼

1, 在 MyEclipse 10中 新建一WebService專案:WsAuthServer

1),  ITest.java

package com.Server;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.*;
import javax.jws.soap.SOAPBinding.Style;

@WebService
@SOAPBinding(style = Style.RPC)
public interface ITest {
         @WebMethod
         public String SayHello(String name);
}
2),  Test.java
package com.Server;

import javax.jws.WebService;
 
@WebService(endpointInterface = "com.Server.ITest")
public class Test implements ITest {
	
	@Override
	public String SayHello(String name) {
              return "Hello: " + name;
	}
	
}

3), 讓MyEclipse 自動生成WebService

          注意:如果 是jax-ws方式建立的webservice, 必須 加入JAX-WS 相關的2個包。

    加入方法:專案名 右鍵 --> Build Path --> Add Libraies --> MyEclipse Libraries --> 拉到最下面 ,選中 JAX-WS的2個jar包

           如果 釋出失敗,檢查 WebRoot\WEB-INF目錄下的sun-jaxws.xml檔案:

<?xml version = "1.0"?>
<endpoints version="2.0"
	xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
	<endpoint name="TestPort"
		implementation="com.Server.TestDelegate"
		url-pattern="/TestPort">
	</endpoint></endpoints>

         如果釋出成功,我們可以通過這個URL在瀏覽器中訪問:http://localhost:8080/WsAuthServer/TestPort?wsdl

二, Client端的程式碼 

1,在MyEclipse 10 中 新建一個project: WsAuthClient

1), 新建一個 WebServiceClient, 把 剛才的webservice 通過url 方式引入 其中,按MyEclipse提示會自動生成一堆程式碼。

                  

2), 新建一個 test.java

             在 main方法中粘進如下程式碼:

TestService service = new TestService();
ITest portType = service.getTestPort();
portType.sayHello("JASON");
         執行,會得到:Result=>Hello: JASON

         至此,不需要使用者驗證的server端和client端已完成。 但我們的主題是 需要加入使用者驗證,所以我們還得繼續下面的步驟。

三, Tomcat的配置檔案 及 Server端的配置

1,tomcat配置使用者角色及使用者資訊。

我這裡是 tomcat7, 找到 Tomcat 7.0\conf 目錄下的 tomcat-users.xml 檔案.

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="WsOperator"/>
  <user username="TomcatWs" password="你的密碼(自己設定)" roles="WsOperator"/>
</tomcat-users>
     2,server端配置web.xml

      WsAuthServer 專案 的 WebRoot\WEB-INFO目錄下的web.xml 

     加入如下內容:

<security-role>
  <description>Normal operator user</description>
  <role-name>WsOperator</role-name>
</security-role>
<security-constraint>
  <web-resource-collection>
    <web-resource-name>Operator Roles Security</web-resource-name>
    <url-pattern>/TestPort</url-pattern>
  </web-resource-collection>
  <auth-constraint>
    <role-name>WsOperator</role-name>
  </auth-constraint>
  <user-data-constraint>
    <transport-guarantee>NONE</transport-guarantee>
  </user-data-constraint>
</security-constraint>
<login-config>
  <auth-method>BASIC</auth-method>
</login-config>
       將server端的webservice重新發布一次,並重啟 tomcat。

       再通過瀏覽器訪問:http://localhost:8080/WsAuthServer/TestPort?wsdl,會讓你驗證。說明剛才的配置生效了。

四,修改Client端呼叫webservice的方法

        回到client端,重新run一下main中的方法,發現會報錯,這時,client端呼叫webservice的方法需要重新寫:

package com.TEST;

import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.Service;
  
import com.server.*;
 
public class test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
	 
		final String WS_URL = "file:C:/Program Files/Apache Software Foundation/Tomcat 7.0/webapps/WsAuthServer/WEB-INF/wsdl/TestService.wsdl";
		final String S_URL = "http://localhost:8080/WsAuthServer/TestPort?wsdl";
 
		URL url;
		try {
			 url = new URL(WS_URL);
		
			 QName qname = new QName("http://Server.com/","TestService");
			 Service service = Service.create(url, qname);
			 ITest port=service.getPort(ITest.class);
			 BindingProvider bp = (BindingProvider) port;
			 bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY,"TomcatWs");
			 bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "111");
			 bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,S_URL);
			 String rtnMessage = port.sayHello("JASON");
			 System.out.println("Result=>" + rtnMessage);
		 
		} catch (Exception e) {
			System.out.println("error");
			System.out.println(e.getMessage());
		}
		 
	}

}
          RUN一遍,得到如下資訊:

    error
request requires HTTP authentication: Unauthorized

         如果把 下面的111 換成你自己的密碼,又會得到 Result=>Hello: JASON

 bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "111");

補充:PC的client端還有另外一種寫法:

	final String WS_URL = "file:C:/Program Files/Apache Software Foundation/Tomcat 7.0/webapps/WsAuthServer/WEB-INF/wsdl/TestService.wsdl";
		final String S_URL = "http://localhost:8080/WsAuthServer/TestPort?wsdl";
		 
		URL url;
		try {
			 url = new URL(WS_URL);
 
			 QName qname = new QName("http://Server.com/","TestService");
			 TestService service = new TestService(url, qname);
			 TestDelegate test = service.getTestPort();
			 
			 BindingProvider bp = (BindingProvider) test;
			 bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY,"TomcatWs");
			 bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "你的密碼");
			 bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,S_URL);
			   
			 String rtnMessage = test.sayHello("JASON");
			 System.out.println("Result=>" + rtnMessage);
			
			 /* 
		     rtnMessage = test.sumCalc(23, 423);
			 System.out.println("Result=>" + rtnMessage); 
			 
			 rtnMessage = test.getCurrentServerTime();
			 System.out.println("Result=>" + rtnMessage); */
			  
			/* BindingProvider bp = (BindingProvider) service;
			    Map<String,Object> context = bp.getRequestContext();

			    context.put(BindingProvider.USERNAME_PROPERTY, "myusername");
			    context.put(BindingProvider.PASSWORD_PROPERTY, "mypassword");*/
  
		} catch(Exception ex)
		{
			System.out.println(ex.getMessage());
		}
		
		System.out.println("the end.");

至此, 一個完整的使用者驗證結束。非常感謝。