JDK6开发WebService及用户认证

[b]一、编写服务端并发布[/b]
[b]1、定义接口[/b]

public interface EchoService {

public String echo(String name);

}

[b]2、接口实现[/b]

@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;
}

}

[b]3、处理用户身份认证类[/b]

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;
}
}

[b]4、请求处理链(handle-chain.xml)[/b]

<?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>

[b]5、发布WS服务[/b]

public class WSPublisher {

public static void main(String[] args){

Endpoint.publish("http://localhost:8099/echoService", new EchoServiceImpl());
System.out.println("publish all services...");

}

}

[b]二、编写调用WS的客户端[/b]

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();
}
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值