最近在做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();
}
}
}