开发者社区> 问答> 正文

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

最近在做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值,万分感谢!!!

展开
收起
kun坤 2020-05-28 16:34:16 613 0
1 条回答
写回答
取消 提交回答
  • 问题已经解决了,从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();
                }
            }
    }
    2020-05-29 10:44:08
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
阿里邮箱—安全高效集成 立即下载
集成智能接入网关APP:优化企业级移动办公网络 立即下载
云效助力企业集成安全到DevOps中 立即下载