使用JDK自带的 JAX-WS调用。
先用vs2010写一个webService
1、自定义soap类
public class SecuritySOAPHeader : System.Web.Services.Protocols.SoapHeader
{
public SecuritySOAPHeader()
{
}
public string UserName { get; set; }
public string UserPass { get; set; }
}
2.写webService
public SecuritySOAPHeader currentUser;
/// <summary>
/// 取OU字串列表
/// </summary>
/// <param name="domainADsPath">LDAP</param>
/// <returns></returns>
[WebMethod(EnableSession = true), SoapHeader("currentUser")]
public string SayHello(string name)
{
if (currentUser == null) return "需要验证";
if (!ValidateUser(currentUser.UserName, currentUser.UserPass))
{
return "验证错误";
}
try
{
return name+"调用成功!";
}
catch(Exception ex)
{
return ex.Message;
}
}
#region 检测用户
/// <summary>
/// 检测用户
/// </summary>
/// <param name="user"></param>
/// <param name="pass"></param>
/// <returns></returns>
private bool ValidateUser(string user, string pass)
{
string u = SoftoonHelpers.ConfigHelper.GetAppSection("wsUser");
string p = SoftoonHelpers.ConfigHelper.GetAppSection("wsPwd");
if (String.IsNullOrEmpty(u) || String.IsNullOrEmpty(p)) return false;
//u = SoftoonHelpers.SecurityHelper.md5(u);
p = SoftoonHelpers.SecurityHelper.md5(p);
if (u.Equals(user) && p.Equals(pass))
{
return true;
}
return false;
}
#endregion
一个Service就成功了。
先说下用 .Net调,非常简单
1.先引用WEB e服务
2。调用
SecuritySOAPHeader head = new SecuritySOAPHeader();
head.UserName = "jamin";
head.UserPass = Md5("7csky.cn").ToUpper();
SyncAD ws = new SyncAD();
ws.SecuritySOAPHeaderValue = head;
ws.SayHello("张三");
OK,马上Java调用
public static void main(String[] args) throws MalformedURLException {
URL url=new URL("http://172.24.29.235:90/ws/SyncAD.asmx?wsdl");
QName qName=new QName("http://WebAD.com/", "SyncAD");
SyncAD ad=new SyncAD(url, qName);
HeaderHandlerResolver handlerResolver=new HeaderHandlerResolver();
ad.setHandlerResolver(handlerResolver);
SyncADSoap p= ad.getSyncADSoap();
String hello=p.SayHello("张三");
}
要写二个自定义的
麻烦就在这里了.
public class HeaderHandlerResolver implements HandlerResolver {
@SuppressWarnings("rawtypes")
@Override
public List<Handler> getHandlerChain(PortInfo portInfo) {
List<Handler> handlerChain = new ArrayList<Handler>();
HeaderHandler hh = new HeaderHandler();
handlerChain.add(hh);
return handlerChain;
}
}
public class HeaderHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
Boolean request_p = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (request_p) {
try {
SOAPMessage msg = context.getMessage();
//从SOAP信息中取出认证信息
SOAPEnvelope env = msg.getSOAPPart().getEnvelope();
SOAPHeader hdr = env.getHeader();
if (hdr == null)
hdr = env.addHeader();
// 添加认证信息 自定义soap头名
QName qname_user = new QName("http://WebAD.com/", "SecuritySOAPHeader");
SOAPHeaderElement sso = hdr.addHeaderElement(qname_user);
sso.setActor(SOAPConstants.URI_SOAP_1_2_ROLE_NEXT);
//名称 有前缀则加
SOAPElement username = sso.addChildElement("UserName");
//值
username.addTextNode("jamin");
SOAPElement psw = sso.addChildElement("UserPass");
psw.addTextNode("7csky.cn");
msg.saveChanges();
// 把SOAP消息输出到System.out,即控制台 调试信息
//msg.writeTo(System.out);
return true;
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
@Override
public boolean handleFault(SOAPMessageContext context) {
// TODO Auto-generated method stub
return false;
}
@Override
public void close(MessageContext context) {
// TODO Auto-generated method stub
}
@Override
public Set<QName> getHeaders() {
// TODO Auto-generated method stub
return null;
}
}