Spring集成JAX-WS handler无法获取head中的内容 400 请求报错  -问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

Spring集成JAX-WS handler无法获取head中的内容 400 请求报错 

kun坤 2020-05-28 16:34:16 25

最近在做webservice程序时,由于要对数据做一个权限的校验,因此需要在请求信息中的head中添加username和password两个字段,webservice服务端需要对username和password进行校验,程序获取到的请求信息如下:

<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:pp="http://pp.soa.csg.cn" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header> <username xmlns:pp="http://pp.soa.csg.cn" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">test</username> <password xmlns:pp="http://pp.soa.csg.cn" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">test</password> </soapenv:Header> <soapenv:Body> <pp:test xmlns:pp="http://pp.soa.csg.cn" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xml="http://www.w3.org/XML/1998/namespace"> <arg0>test</arg0> </pp:test> </soapenv:Body> </soapenv:Envelope>
从上面的请求信息是可以看出来,head中是存在username和password的。

然而在handler中获取head中的username和password时,便获取不到了,handler代码如下:

public boolean handleMessage(SOAPMessageContext context) {
	boolean isExceSuc = true;
	Boolean isResponse = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
		
	// 请求
	if(!isResponse){
		try {
				
			// 获取请求头信息
			SOAPMessage message = context.getMessage();
				
			SOAPEnvelope soapEnv = message.getSOAPPart().getEnvelope();  
		       SOAPHeader soapHeader = soapEnv.getHeader(); 
				
			if(soapHeader == null){
				generateSOAPErrMessage(message, "10004", "head is null");
			}
				
			String username = soapHeader.getAttribute("username");
			System.out.println("username:"+username);
			String password = soapHeader.getAttribute("password");
			System.out.println("password:"+password);
				
			if(!"test".equals(username) || !"test".equals(password)){
				generateSOAPErrMessage(message, "10005", "check security failed");
			}
		} catch (SOAPException e) {
				isExceSuc = false;
		}
	}
	return isExceSuc;
}

soapHeader的值为[soapenv:Header: null]

这里是applicationContext.xml配置文件的片段:

<wss:binding url="/ppservice">
   <wss:service >
      <ws:service bean="#ppWebService" >
         <ws:handlers >
           <ref bean="securityHandler"/>
         </ws:handlers>
      </ws:service>
   </wss:service>
</wss:binding>

web.xml

<servlet>
  	<servlet-name>JAXWSServlet</servlet-name>
  	<servlet-class>
   		com.sun.xml.ws.transport.http.servlet.WSSpringServlet
 	</servlet-class>
  	<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
        <servlet-name>JAXWSServlet</servlet-name>
        <url-pattern>/ppservice</url-pattern>
</servlet-mapping>

各位大神请帮忙分析一下是什么原因导致的没有办法获取到head中的username与password值,万分感谢!!!

Java Spring
分享到
取消 提交回答
全部回答(1)
  • kun坤
    2020-05-29 10:44:08

    问题已经解决了,从debug的打印信息中看到确实是没有,估计是toString方法忽略了一部分内容,实际header部分的信息是存在,是我的程序在写的时候取值出现了问题,下面是修改过的程序代码:

    Iterator<ElementImpl> it = soapHeader.getChildElements();
    String username = null;
    String password = null;
    while(it.hasNext()){
        ElementImpl ei = it.next();
            if(USER_NAME.equals(ei.getElementName().getLocalName())){
    	    if(ei.getTextContent()!=null){
    		username = ei.getTextContent().trim();
                }
            }
            if(PASSWORD.equals(ei.getElementName().getLocalName())){
    	    if(ei.getTextContent()!=null){
    		password = ei.getTextContent().trim();
                }
            }
    }
    0 0
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题