`

jax-ws之webservice security(安全)教程第二天

 
阅读更多

前言:

第一天里说了如何用jax-ws去结合ssh框架。

在今天的教程中将会向大家详细讲述一个ws-security中的一个传统的”基于handler”来认证客户端传来的用户名密码的webservice.

客户端传过来一对用户名和密码,服务端进行认证。

当然,我们此处说这个用户名和密码的传送,那可不是用下面的这种形式来传送的哦: http://xxx.do?username=xxx&password=xxx

我们这个用户名和密码是带在soap报文中的, jax-ws用一个handler专门用于处理soap报文的。

一、书写Handler

1. 1 handler

package ctsjavacoe.ws.fromjava;

import java.util.*;

import javax.servlet.http.HttpServletRequest;

import javax.xml.namespace.QName;

import javax.xml.soap.*;

import javax.xml.ws.handler.MessageContext;

import javax.xml.ws.handler.soap.*;

import javax.xml.ws.soap.SOAPFaultException;

import org.apache.cxf.transport.http.*;

public class AuthValidationHandler implements SOAPHandler<SOAPMessageContext> {

public Set<QName> getHeaders() {

// TODO Auto-generated method stub

return null;

}

public void close(MessageContext context) {

}

public boolean handleFault(SOAPMessageContext context) {

return false;

}

public boolean handleMessage(SOAPMessageContext context) {

HttpServletRequest request = (HttpServletRequest) context

.get(AbstractHTTPDestination.HTTP_REQUEST);

//

if (request != null) {

System.out.println("Client IP:" + request.getRemoteAddr());

} else {

System.out.println("get client ip is null>>>>>>>>>");

}

Boolean outbound = (Boolean) context

.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

if (!outbound.booleanValue()) {

SOAPMessage soapMessage = context.getMessage();

try {

SOAPEnvelope soapEnvelope = soapMessage.getSOAPPart()

.getEnvelope();

SOAPHeader soapHeader = soapEnvelope.getHeader();

if (soapHeader == null)

generateSoapFault(soapMessage, "No Message Header...");

Iterator it = soapHeader

.extractHeaderElements(SOAPConstants.URI_SOAP_1_2_ROLE_NEXT);

if (it == null || !it.hasNext())

generateSoapFault(soapMessage,

"No Header block for role next");

Node node = (Node) it.next();

String value = node == null ? null : node.getValue();

if (value == null)

generateSoapFault(soapMessage,

"No authation info in header blocks");

String[] infos = value.split("&");

return authValidate(infos[0], infos[1]);

} catch (SOAPException e) {

e.printStackTrace();

}

}

return false;

}

private boolean authValidate(String userName, String password) {

if (userName == null || password == null) {

return false;

}

if ("admin".equals(userName) && "admin".equals(password)) {

return true;

}

return false;

}

private void generateSoapFault(SOAPMessage soapMessage, String reasion) {

try {

SOAPBody soapBody = soapMessage.getSOAPBody();

SOAPFault soapFault = soapBody.getFault();

if (soapFault == null) {

soapFault = soapBody.addFault();

}

soapFault.setFaultString(reasion);

throw new SOAPFaultException(soapFault);

} catch (SOAPException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

上面这段代码看似很长,其实逻辑很简单,注意:

publicboolean handleMessage(SOAPMessageContext context)这个方法。

Handler会先检查,这个soap是in还是out,当然,对于我们来说要验证客户端提交上来的用户名和密码,因该是in。

因此,如果这个soap是in,并且含有soapheader(我们的用户名密码是含在soap header中的,可不是通过url以http://xxx.xxx.xxx/xxx.do?username=xxx&password=xxx这样的形式传输的哦,这样做是彻头彻尾的,不对的作法,和掩耳盗铃没啥区别),并且含有soap header,这个soap header中会提取出“username&password”这样的一个字符串,然后进行用户名和密码的比对与校验。


1.2handler类的XML描述

我们有了Handler类,还需要有一个handler的xml文件,对该类进行描述,这个xml文件和handler类放在同一层java的package下,该XML名为:handlers.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">

<handler-chain>

<handler>

<handler-name>authHandler</handler-name>

<handler-class>

ctsjavacoe.ws.fromjava.AuthValidationHandler

</handler-class>

</handler>

</handler-chain>

</handler-chains>

二、书写Webservice并引用handler

2.1 接口

package ctsjavacoe.ws.fromjava;

import javax.jws.WebMethod;

import javax.jws.WebService;

import javax.jws.soap.SOAPBinding;

import javax.jws.soap.SOAPBinding.Style;

@WebService

@SOAPBinding(style = Style.RPC)

public interface AuthorServer {

@WebMethod

public String sayHello(String name);

}

2.2 实现类

package ctsjavacoe.ws.fromjava;

import javax.jws.HandlerChain;

import javax.jws.WebService;

@WebService(endpointInterface = "ctsjavacoe.ws.fromjava.AuthorServer")

@HandlerChain(file = "handlers.xml")

public class AuthorServerImpl implements AuthorServer {

public String sayHello(String name) {

return "Hello: " + name;

}

}

核心是这一行:@HandlerChain(file= "handlers.xml")。

把它编译成webservice,然后发布工程到tomcat中去吧。

得到wsdl: http://localhost:8080/JaxWSSample/AuthorServerService?wsdl

我们用SOAPUI来调用这个webservice试试效果:

大家可以看到入到的output是:<faultstring>No Header blockfor role next</faultstring>

三、书写客户端

根据wsdl先得到相关的stub。

3.1 书写client端的handler类

package ctsjavacoe.ws.fromjava;

import java.util.Set;

import javax.xml.namespace.QName;

import javax.xml.soap.*;

import javax.xml.ws.handler.MessageContext;

import javax.xml.ws.handler.soap.SOAPHandler;

import javax.xml.ws.handler.soap.SOAPMessageContext;

public class ClientAuthenticationHandler implements SOAPHandler<SOAPMessageContext> {

public Set<QName> getHeaders() {

// TODO Auto-generated method stub

return null;

}

public void close(MessageContext arg0) {

// TODO Auto-generated method stub

}

public boolean handleFault(SOAPMessageContext arg0) {

// TODO Auto-generated method stub

return false;

}

public boolean handleMessage(SOAPMessageContext ctx) {

Boolean request_p = (Boolean) ctx

.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

if (request_p) {

try {

SOAPMessage msg = ctx.getMessage();

SOAPEnvelope env = msg.getSOAPPart().getEnvelope();

SOAPHeader hdr = env.getHeader();

if (hdr == null)

hdr = env.addHeader();

QName qname_user = new QName("http://fromjava.ws.ctsjavacoe/",

"AuthorServerImplService");

SOAPHeaderElement helem_user = hdr.addHeaderElement(qname_user);

helem_user.setActor(SOAPConstants.URI_SOAP_1_2_ROLE_NEXT);

helem_user.addTextNode("admin&admin1");

msg.saveChanges();

//msg.writeTo(System.out);

return true;

} catch (Exception e) {

e.printStackTrace();

}

}

return false;

}

}

该handler类主要的核心方法为:

public booleanhandleMessage(SOAPMessageContext ctx)方法

该方法中需要注意的是:

QName qname_user = new QName("http://fromjava.ws.ctsjavacoe/",

"AuthorServerImplService");

SOAPHeaderElement helem_user = hdr.addHeaderElement(qname_user);

helem_user.setActor(SOAPConstants.URI_SOAP_1_2_ROLE_NEXT);

helem_user.addTextNode("admin&admin1");

msg.saveChanges();

我们通过上述的语句就已经知道我们会在客户端传过去一对用户名与密码,它们是:

username=admin

password=admin1

3.2 书写客户端

package ctsjavacoe.ws.fromjava;

import java.util.*;

import javax.xml.ws.handler.Handler;

import javax.xml.ws.handler.HandlerResolver;

import javax.xml.ws.handler.PortInfo;

public class AuthorServerClient {

public static void main(String[] args) {

AuthorServerImplService service = new AuthorServerImplService();

service.setHandlerResolver(new HandlerResolver() {

public List<Handler> getHandlerChain(PortInfo arg0) {

List<Handler> handlerList = new ArrayList<Handler>();

handlerList.add(new ClientAuthenticationHandler());

return handlerList;

}

});

AuthorServer authorService = service.getAuthorServerImplPort();

String msg = authorService.sayHello("MK");

System.out.println("rtn msg=====" + msg);

}

}


四、运行上述例子后出错啦?为什么?

运行后我们得到了如下的输出:


出错了?为什么?

我们回过头来看两个handler,一个是server端的handler,其中:

if ("admin".equals(userName) && "admin".equals(password)) {

return true;

}

一个是client的handler类,其中:

helem_user.addTextNode("admin&admin1");

啊。。。因为server端的密码要求是”admin”不是”admin1”,于是我们把client端的密码也改成”admin”,再次运行我们的客户端,得到输出:

完成第二天的教程



分享到:
评论

相关推荐

    jax-ws实现webservice调用

    在本教程中,我们将深入探讨如何使用JAX-WS来发布和调用Web服务。 ### 1. JAX-WS概述 JAX-WS提供了一种简化的方式,将Java方法映射到Web服务操作,反之亦然。它包括以下组件: - **Service Endpoint Interface ...

    webservice之jax-ws

    【标题】:Web服务之Java API for XML Web Services (JAX-WS) 【内容详解】 JAX-WS,全称为Java API for XML Web Services,是Java平台上的一个标准,用于构建和部署基于SOAP(Simple Object Access Protocol)的...

    jax-ws api jar包

    - **可扩展性**:支持WS-Security、WS-ReliableMessaging等高级Web服务协议,以满足安全性、可靠性的需求。 5. **与JAX-RPC的区别:** - JAX-WS是JAX-RPC的后续版本,它在设计上更注重简洁性和性能,且更符合现代...

    jax-ws WebService客户端与服务端工程.rar

    - JAX-WS支持安全特性,如WS-Security(Web Services Security),可以添加数字签名和加密以确保数据的安全传输。 7. **性能优化**: - 缓存WSDL:客户端可以缓存WSDL,减少网络请求。 - MTOM(Message ...

    JAX-WS开发webservice示例详解

    - 安全性:利用WS-Security等规范,可以实现Web服务的身份验证和加密。 **5. 总结** 通过JAX-WS,开发者可以方便地构建和消费SOAP Web服务。MyEclipse等IDE提供了友好的集成环境,简化了整个过程。在实际项目中,...

    metro-jax-ws-jaxws221x.zip

    它涵盖了从基本的SOAP(Simple Object Access Protocol)通信到更复杂的XML数据绑定和WS-Security安全配置等各种功能。 JAX-WS是Java平台上的一个标准API,用于构建和部署面向服务架构(SOA)中的Web服务。它简化了...

    jax-ws2.1.zip

    2. **webservices-extra.jar** - 此文件可能包含JAX-WS的一些扩展或额外功能,如WS-I(Web Services Interoperability)支持,或者对特定Web服务协议的实现,例如WS-Security(Web Services Security)或其他厂商...

    Jax-ws RI.zip

    WS-Security用于安全的Web服务通信;以及WS-ReliableMessaging和WS-Addressing等,增强了消息传递的可靠性和寻址能力。 总的来说,"Jax-ws RI.zip"是一个关键组件,用于在Tomcat环境中搭建和运行基于JAX-WS的Web...

    JAX-WS使用教程(内含jar包)

    4. **安全性**:JAX-WS提供了一套完整的安全模型,包括基本认证、TLS加密、WS-Security等,保障Web服务的安全性。 **总结** JAX-WS是Java开发者构建Web服务的重要工具,其简单易用的API和强大的功能使得创建和消费...

    JAX-WS低版本

    9. **安全性**:JAX-WS支持多种安全模型,包括基本认证、HTTPS、WS-Security等,以确保Web服务的安全通信。 10. **调试与测试**:开发者可以使用诸如soapUI这样的工具,通过发送SOAP请求来测试和调试JAX-WS Web服务...

    学习JAX-WSWebService开发

    此外,JAX-WS还提供了多种高级特性,如MTOM(Message Transmission Optimization Mechanism)用于优化二进制数据传输,以及WS-Security用于实现Web服务的安全性。在实际开发中,了解这些特性将有助于提高Web服务的...

    jax-ws实践教程代码helloWS.zip jax-ws实践教程代码helloWS.zip

    JAX-WS还支持各种高级特性,如WS-Security(安全)、WS-ReliableMessaging(可靠消息传递)和WS-Policy(策略),这些都是构建复杂、安全的Web服务时的关键部分。 10. **学习资源** 对于初学者,这个"helloWS...

    JAX-WS开发部署WebService

    【JAX-WS开发部署WebService】是Web服务开发的一个重要主题,主要涉及到使用Java API for XML Web Services(JAX-WS)创建和部署基于SOAP的Web服务。JAX-WS是一种标准的、Java平台上的API,它使得开发人员能够轻松地...

    Web Service学习小结——基于JDK自带JAX-WS实现的web service

    - 考虑到Web服务的安全性,JAX-WS支持WS-Security标准,可以实现消息认证、加密和签名。 8. **测试**: - 使用工具如`wsimport`生成客户端代码后,可以编写测试用例来验证服务的正确性。 9. **ws_1文件**: - ...

    JAX-WS之旅(二)

    在JAX-WS之旅的第二部分中,我们将深入探讨这个Java API for XML Web Services的核心概念和技术细节。JAX-WS是Java平台上的一个标准,用于创建和消费Web服务,它使得开发人员能够轻松地实现基于SOAP的Web服务。在这...

    JAX-WS之旅(一)

    - **WS-Security**:提供Web服务安全标准,如数字签名和加密。 - **WS-ReliableMessaging**:确保消息传递的可靠性和顺序。 - **WS-Addressing**:处理Web服务的寻址问题。 **7. 结论** JAX-WS为Java开发者提供了...

    JAX-WS2.0规范

    4. **安全性增强**:内置了对 WS-Security 等安全协议的支持,确保了数据传输的安全性和完整性。 #### 三、JAX-WS 2.0 规范的技术细节 1. **SOAP 支持**: - **SOAP 1.2**:与 SOAP 1.1 相比,SOAP 1.2 引入了更...

    JAX-WS Five Minute Tutorial 源码

    2. **消息级安全**:JAX-WS支持WS-Security,可以对消息进行加密、签名等安全操作。 3. **MTOM与SwA**:JAX-WS支持MTOM(Message Transmission Optimization Mechanism)和SwA(SwaReference)技术,用于优化大型...

    JAX-WS(java api xml webservice)

    JAX-WS的优势在于其与Java EE的集成,使得Web服务的开发和部署变得简单,同时提供了高级特性,如MTOM(Message Transmission Optimization Mechanism)和WS-Security,以支持大文件传输和安全通信。 学习JAX-WS有助...

Global site tag (gtag.js) - Google Analytics