[已解决]: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文件:



	
	

         如果发布成功,我们可以通过这个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 文件.



  
  
     2,server端配置web.xml

      WsAuthServer 项目 的 WebRoot\WEB-INFO目录下的web.xml 

     加入如下内容:


  Normal operator user
  WsOperator


  
    Operator Roles Security
    /TestPort
  
  
    WsOperator
  
  
    NONE
  


  BASIC
       将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 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.");

至此, 一个完整的用户验证结束。非常感谢。

你可能感兴趣的:(java)