JDK6开发WebService及用户认证

标签: jdk6 开发 webservice | 发表时间:2015-08-21 13:50 | 作者:log_cd
出处:http://www.iteye.com
一、编写服务端并发布
1、定义接口
public interface EchoService {

	 public String echo(String name);
	
}

2、接口实现
@WebService(name="wsecho",portName="echoServicePort", serviceName="echoService",targetNamespace="http://ws.logcd.net/") 
@SOAPBinding(style = Style.DOCUMENT,use = Use.LITERAL)//Style.DOCUMENT为默认值
@HandlerChain(file="handle-chain.xml")
public class EchoServiceImpl implements EchoService{

	@WebMethod()
	public String echo(//指定参数名及命名空间
			@WebParam(name="userName", targetNamespace="http://ws.logcd.net/") String name) {
		return "hello, " + name;
	}

}

3、处理用户身份认证类
public class AuthValidatorHandler implements SOAPHandler<SOAPMessageContext> {

	public static final String TARGET_NAMESPACE = "http://ws.logcd.net/";
	
	public static final String AUTH_HEADER_NAME = "AuthHeader";
	
	public static final Map<String,String> cacheAcountMap = new HashMap<String,String>();
	
	static{
		cacheAcountMap.put("510028", "123456");
	}
	
	@SuppressWarnings("unchecked")
	public boolean handleMessage(SOAPMessageContext ctx) {
    	
       Boolean isResponsed=(Boolean)ctx.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
       if(!isResponsed){
           SOAPMessage msg=ctx.getMessage();
           try {
        	  
        	   String id = "", pwd = "";
        	   SOAPHeader header = msg.getSOAPHeader();
              Iterator<SOAPHeaderElement> it = header.getChildElements(new QName(TARGET_NAMESPACE, AUTH_HEADER_NAME));
              
              if(it.hasNext()){
            	  SOAPHeaderElement headElem = (SOAPHeaderElement)it.next();
            	  Iterator<SOAPElement> eleIt = headElem.getChildElements();
            	  
            	  while(eleIt.hasNext()){
            		  SOAPElement ele = eleIt.next();
            		  String key = ele.getLocalName();
            		  
            		  if(key.toUpperCase().equals("ACCOUNT")){
            			  String val = ele.getValue();
            			  String[] arr = val.split("/");
            			  if(arr.length == 2){
	            			  id = arr[0]; 
	            			  pwd = arr[1];
            			  }
            			  break;
            		  }
            	  }
              }
              System.out.println("id="+id+",pwd="+pwd);
              if(StringUtils.isEmpty(id) || StringUtils.isEmpty(pwd)){
            	 throw new SOAPFaultException(new QName(TARGET_NAMESPACE, "-1"),
            			 "User Acount Err!", "id or pwd is empty.", null);
              }
              
              return authValidate(id, pwd);
           } catch (SOAPException e) {
              throw new RuntimeException(e);
           }
       }
       return false;
    }
    
    /*
     * 验证用户名和密码
     */
    private boolean authValidate(String id, String pwd){
    	if(cacheAcountMap.containsKey(id) 
    				&& ((String)cacheAcountMap.get(id)).equals(pwd)){
    		return true;
    	}else{
       	 	throw new SOAPFaultException(new QName(TARGET_NAMESPACE, "-2"),
    			 "Unauthorized Visit!", "id or pwd incorrect.", null);
    	}
    }
   
	@Override
	public void close(MessageContext arg0) {
		
	}

	@Override
	public boolean handleFault(SOAPMessageContext arg0) {
		return false;
	}

	@Override
	public Set<QName> getHeaders() {
		return null;
	}
}

4、请求处理链
<?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.cdmcs.jws.auth.AuthValidatorHandler</javaee:handler-class>
           
       </javaee:handler>
       
    </javaee:handler-chain>
    
</javaee:handler-chains>

5、发布WS服务
public class WSPublisher {

	public static void main(String[] args){
		
		Endpoint.publish("http://localhost:8099/echoService", new EchoServiceImpl()); 	
		System.out.println("publish all services...");
		
	}
	
}

二、编写调用WS的客户端
public class Jdk6WsAxisClient {

	public static void main(String[] args) {  
        try {  
            String endpoint = "http://localhost:8099/echoService";  
            String nameSpace = "http://ws.logcd.net/";   
  
			Service service = new Service();           
            Call call = (Call) service.createCall();  
            call.setTargetEndpointAddress(endpoint);  
            call.setOperationName(new QName(nameSpace, "echo"));  
  
            //参数名为WebParam中指定的参数名,未指定参数名时传arg0-argN
            //call.addParameter("userName", XMLType.XSD_STRING, ParameterMode.IN); //Style.DOCUMENT,且方法参数没有指定命名空间或Style.RPC 
            call.addParameter(new QName(nameSpace, "userName"), XMLType.XSD_STRING, ParameterMode.IN);//Style.DOCUMENT指定了命名空间
            
            call.setUseSOAPAction(true);  
            call.setReturnType(org.apache.axis.Constants.XSD_STRING);  
            call.setSOAPActionURI(nameSpace+"echoService"); 
            
            SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement(nameSpace, "AuthHeader"); 
            soapHeaderElement.addChildElement("ACCOUNT").setValue("510028/123456");    
            call.addHeader(soapHeaderElement);
            
            String result = (String) call.invoke(new Object[] {"frank"});  
              
            System.out.println(result);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  	
	
}


    本文附件下载:
  • lib.rar (2.7 MB)


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [jdk6 开发 webservice] 推荐:

JDK6开发WebService及用户认证

- - Java - 编程语言 - ITeye博客
一、编写服务端并发布. public String echo(//指定参数名及命名空间. 二、编写调用WS的客户端. //参数名为WebParam中指定的参数名,未指定参数名时传arg0-argN. //call.addParameter("userName", XMLType.XSD_STRING, ParameterMode.IN); //Style.DOCUMENT,且方法参数没有指定命名空间或Style.RPC.

SOAP Webservice和RESTful Webservice

- - 人月神话的BLOG
REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性. REST提出设计概念和准则为:. 1.网络上的所有事物都可以被抽象为资源(resource). 2.每一个资源都有唯一的资源标识(resource identifier),对资源的操作不会改变这些标识.

webservice认证

- - 行业应用 - ITeye博客
1、服务器端,增加拦截认证--ServerPasswordCallback.java.                 throw new WSSecurityException("用户不匹配.                 throw new WSSecurityException("密码不匹配.

WebService性能测试

- - ImportNew
(本文也会在最下面通俗的介绍). 这里给一个站内大哥的讲解: http://www.cnblogs.com/Leo_wl/archive/2010/05/20/1740205.html. 简单点就是测试WebService的一个工具. 官网地址: http://www.soapui.org/. ps:官网是英语的,如果你英语不好的话可以使用谷歌浏览器或360极速浏览器,它可以自动把英文转换成中文.

WebService之JAX-WS、CXF、Spring3.0+

- - 博客园_首页
          面对工作的需要,web服务这一块一直都在身边转悠着. 既然工作中需要这些,作为程序员就应该去了解和学习. 下面主要简述采用CXF+Spring+JAX-WS来发布WebService服务,以及创建客户端调用服务.          1、先了解关于WebService的相关概念以及一些专有名词的解释:.

webservice编程基础—cxf

- - ITeye博客
最近研究了一下cxf的使用,主要的步骤如下:. 下载最新的cxf包apache-cxf-2.6.2.tar.zip,并解压,有一个lib文件,里面的jar包,就是webservice需要的(不完全需要,看你的应用,但是懒的分),加载进你的webservice的工程即可. 配置两个配置文件,为beans.xml和web.xml,内容如下:.

[转]JMeter进行WebService测试

- - 小鸥的博客
1. Building a WebService Test Plan参考. 1.   建立WebServiceTest Plan. 参考 http://jmeter.apache.org/usermanual/build-ws-test-plan.html. 1)      添加ThreadGroup.

CXF WEBSERVICE 安全验证

- - 企业架构 - ITeye博客
CXF 封装的接口,不希望对外暴露 WSDL结构,找到的CXF安全认证技术都是基于拦截器,在调用的时候返回认证错误信息, 不能保护WSDL不被看到,后来看到别人的一个实现方式最简单有效,基于URL拦截的安全保护,用FILTER. 现在把这2种安全保护都记录下来,备用. 参考: http://www.myexception.cn/open-source/1505475.html.

avaya vp ivr 调用webservice

- - 行业应用 - ITeye博客
术语:ivr,vp,dd5.0都是指同一个东西. 调用接口,除了利用vp里面自带的webservice接口外,也可以利用纯Java代码.    只要是yyyy-MM-dd的格式,就可以利用date来读. 选择year,month,day那种即可.    vp里面没有循环,只能利用判断和goto来达到要求.

为什么 web 开发人员需要迁移到. NET Core, 并使用 ASP.NET Core MVC 构建 web 和 webservice/API - 张善友 - 博客园

- -
2018 .NET开发者调查报告: .NET Core 是怎么样的状态,这里我们看到了还有非常多的.net开发人员还在观望,本文给大家一个建议. 这仅代表我的个人意见, 我有充分的理由推荐.net 程序员使用. 有些人可能不同意我的观点, 但是分享想法和讨论它是好的. .net 程序员或他们所在的团队总有各种理由说他们的系统还在使用旧系统, 这显然是企业开发人员的事情.