最近在做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值,万分感谢!!!
问题已经解决了,从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(); } }
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。