说明:在网上找了一堆 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.");
至此, 一个完整的用户验证结束。非常感谢。
内容来源于 小红提技术博客,http://www.xiaohongti.com/ 转载请保留地址,尊重版权。