`
darrendu
  • 浏览: 195749 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

05_JAX-WS Handler使用

    博客分类:
  • CXF
阅读更多

1.Handler和Servlet中的filter极为相似,我们可以对所有WebServicer进行拦截,在这个Handler中我们可以记录日志、

   权限控制、对请求的SOAP消息进行加密,解密等。CXF也有Interceptor,不知道有什么区别,后面会学习

 

2.接口javax.xml.ws.handler.Handler和javax.xml.ws.handler.soap.SOAPHandler

  定义自己Handler需要实现两个Handler其中一个SOAPHandler是Handler的子接口

  Handler的三个方法

 

 

 

void

 

 

 close(MessageContext context) :一个webService调用结束时会调用,通常会做释放资源的操作
          

 

  boolean 

 

handleFault(C context) :当handlerMessage发生异常时,会调用
          

 

 boolean

 

 handleMessage(C context):调用webService inbound和outbound时都会调用,一次webService调用,

                                           会调用该方法两次

 

 

 

3.实现一个用户身份验证的Handler来说明Handler使用

   3.1定义我们自己Handler

        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);
		
		System.out.println("客户端IP:"+request.getRemoteAddr());
		
		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();
		}
	}

	
}

   HttpServletRequest request = (HttpServletRequest)context.get(AbstractHTTPDestination.HTTP_REQUEST);

   可以获取request对象,从而拿到客户端Ip,可以进行非法地址ip排除

 

  Boolean outbound = (Boolean)context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

  判断当前是Inbound还是outbound

  只在inbound时做用户校验

 

  我们将用户相信放在soapheader里

 

   3.2在SEI实现类UserServiceImpl上添加@HandlerChain(file = "handlers.xml")

 

   3.3在UserServiceImpl所在包下编写handlers.xml

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

                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xsi:schemaLocation="http://java.sun.com/xml/ns/javaee">
  <handler-chain>

    <handler>
      <handler-name>authHandler</handler-name>
      <handler-class>com.cxf.users.AuthValidationHandler</handler-class>
    </handler>
  </handler-chain>
</handler-chains>

 

  这样我们服务端就编写好了,我们还有在客户端将我们用户信息加到soapHeader中

 

4.客户端将我们用户信息加到soapHeader中

   4.1客户端Handler

        public class AuthenticationHandler 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://com/auth/","auth");
              SOAPHeaderElement helem_user=hdr.addHeaderElement(qname_user);
              helem_user.setActor(SOAPConstants.URI_SOAP_1_2_ROLE_NEXT);
              helem_user.addTextNode("admin&admin");
              msg.saveChanges();
              //把SOAP消息输出到System.out,即控制台
              msg.writeTo(System.out);
              return true;
           } catch (Exception e) {
              e.printStackTrace();
           }
       }
	       return false;
	}

	
}

 

  4.2将Handler加到HandlerResolver中

      public class UserClient {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		UserServiceImplService userServiceImpl = new UserServiceImplService();
		
		userServiceImpl.setHandlerResolver(new HandlerResolver(){

			public List<Handler> getHandlerChain(PortInfo arg0) {
				
				List<Handler> handlerList = new ArrayList<Handler>();
	            //添加认证信息
	            handlerList.add(new AuthenticationHandler());
	              return handlerList;
			}
			
		});
		
		
		IUserService service = userServiceImpl.getUserServiceImplPort();
		
		
		User u = new User();
		u.setId(110);
		u.setUserName("张三");
		u.setAddress("杭州");
		u.setSex(0);
		System.out.println();
		System.out.println(service.addUser(u));
		
	}

}

 

   这样验证就做好了

 

 

 

 

 

分享到:
评论
1 楼 Sev7en_jun 2012-01-12  

相关推荐

    JAX-WS2.1用户指南

    使用JAX-WS,可以通过简单的注解在Java类上声明服务端点接口,并将其部署到支持JAX-WS的服务器上,如Tomcat或JBoss。服务可以使用HTTP、HTTPS等传输协议,并且可以与JMS、JCA等其他Java技术集成。 4. **SOAP消息...

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

    2. **消息处理**:JAX-WS支持处理SOAP消息的不同部分,如头、体等,还可以使用Handler链进行自定义处理。 3. **异步调用**:JAX-WS支持异步调用Web服务,提高了响应速度和系统效率。 4. **安全性**:JAX-WS提供了...

    jax-ws用户指南 pdf版

    本用户指南详细介绍了 JAX-WS 2.2 版本的功能、编程模型以及如何使用该 API 来构建 Web 服务应用。 #### 文档结构 - **概述**:简要介绍 JAX-WS 的功能。 - **文档**:提供了指向 JAX-WS 相关文档的链接。 - **软件...

    JAX-WS在Tomcat中发布服务

    在这个实例中,我们将讨论如何在Apache Tomcat服务器上使用JAX-WS发布服务,并在服务处理程序中添加基本的授权验证。 首先,我们需要了解JAX-WS的基础。JAX-WS允许我们通过注解来定义Web服务接口和服务实现,这样就...

    JAX-WS SOAP header设值

    标题中的“JAX-WS SOAP header设值”指的是在Java应用程序中使用JAX-WS(Java API for XML Web Services)框架来设置SOAP消息头的过程。SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在Web服务中...

    WSIT指南-jax-ws指南

    本指南主要介绍如何使用NetBeans结合JAX-WS 2.0来开发Web服务,同时涵盖了JAX-WS处理程序(Handler)与安全机制等内容。JAX-WS (Java API for XML Web Services) 是一种用于构建和访问Web服务的标准API,它简化了...

    JAX-WS2.0规范

    JAX-WS(Java API for XML Web Services)2.0 是一种用于创建和访问 Web 服务的标准 Java API,它允许开发人员使用 Java 编写 Web 服务,并以 XML 的形式进行数据交换。JAX-WS 2.0 由 Java 社区进程 (JCP) 通过 JSR-...

    jax-ws的handler做调用权限校验例子

    在这个例子中,我们将关注如何使用`JAX-WS`的`Handler`机制进行调用权限校验。 `Handler`是`JAX-WS`中的一个重要组件,它允许我们在Web服务调用的生命周期中插入自定义逻辑。这包括在消息发送前、接收到消息后、...

    JAX-WS_Java API for XML Web Services

    2. **生成WSDL**: 使用JAX-WS工具,如`wsimport`,从SEI生成WSDL文档。 3. **实现SEI**: 创建实现类,填充业务逻辑。 4. **部署服务**: 将服务打包成WAR文件,部署到应用服务器,如Tomcat、Glassfish等。 5. **...

    JAX-WS2.2.6包

    3. **SOAP消息处理**:JAX-WS提供了MessageHandler接口,允许开发者对SOAP消息进行自定义处理,如添加安全认证或数据转换。 4. **客户端调用**:使用JAX-WS,开发者可以使用`Service`类来创建客户端代理对象,这个...

    Get a handle on the JAX_WS API's handler framework

    在使用JAX-WS Handler框架时,开发者需要首先理解Handler链的概念,即一系列的Handler按照一定的顺序被调用以处理Web服务的消息。 文章中提到了一个示例应用程序,包含四个简单的Eclipse项目: 1. jaxws-handler:...

    jax-ws handler 的详解及简单实例

    在给定的例子中,`@HandlerChain(file="handlers.xml")` 注解告诉 JAX-WS 使用 handlers.xml 文件来配置 Handler 链。 以下是一个简单的 JAX-WS Handler 实例: 1. 首先,我们有一个简单的 Web Service 类 `Hello`...

    jaxws-api-2.1_jaxb-api-2.1.jar

    这两个库通常一起使用,因为JAXB可以方便地处理JAX-WS中的数据序列化和反序列化。 【JAX-WS详解】 JAX-WS是Java平台的Web服务标准,它是对早期的JAX-RPC(Java API for XML-based RPC)的升级。JAX-WS支持SOAP、...

    JAX-RS-messanger-service:使用JAX-RS的消息传递REST服务

    **JAX-RS-messanger-service: 使用JAX-RS构建消息传递REST服务** JAX-RS(Java API for RESTful Web Services)是Java平台上的一个标准,用于创建基于REST(Representational State Transfer)风格的Web服务。REST...

    java_webservice_myeclipse-源码.rar

    在MyEclipse中,可以使用JAX-WS向导创建一个新的Web服务,通过定义服务接口和服务实现,然后发布到应用服务器上。 2. **WSDL(Web Services Description Language)** 是一种XML格式,用来描述Web服务的接口、消息...

    jaxws-2_1规范

    - 规范还涵盖了如何使用JAX-WS与现有的Java EE环境集成,如EJB和JPA。 4. **JAX-WS的关键概念与组件**: - **Service和Port**:Service代表一个Web服务的抽象,而Port则表示服务的一个具体实例,通常与特定的协议...

    webservice的jar.zip

    Web服务(Web Service)是一种基于互联网的...总之,"webservice的jar.zip"提供了开发和使用基于JAX-WS的Web服务所需的关键库,对于Java开发者来说,掌握这部分知识对于构建分布式系统和实现系统间的数据交换至关重要。

    jax-rpc soap头扩展 客户端,服务端例子

    本文将深入探讨如何在JAX-RPC中使用SOAP头扩展,同时提供客户端和服务端的实例。 ### 一、SOAP头扩展基础 SOAP头是SOAP消息的一个可选部分,允许开发者在消息中携带额外的信息。在JAX-RPC中,我们可以使用...

    JWS Handler 示例

    这可能包含一个服务接口,一个实现该接口的服务类,以及一个配置文件(如handler-config.xml)来定义Handler链。服务端的Handler通常通过@HandlerChain注解或者服务部署描述符(如web.xml)进行配置。 另一方面,...

    WebService之XFire和Jax实现身份验证

    而在JAX-WS中,可能需要实现`javax.xml.ws.handler.soap.SOAPHandler`接口并处理`SOAPMessageContext`。 5. **工具辅助**:虽然可以通过源码手动实现,但现代开发环境中也有许多工具和框架可以简化这个过程。例如,...

Global site tag (gtag.js) - Google Analytics