Webservice_18_利用Handler实现方法认证

来源:互联网 发布:90后童年游戏 知乎 编辑:程序博客网 时间:2024/06/08 11:51

非常感谢孙浩老师。

实现addUser(User user)和list()方法必须有handler信息验证。

 

服务端,验证Handler方法:

@Overridepublic boolean handleMessage(SOAPMessageContext context) {Boolean flag = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);if (!flag) {try {SOAPMessage message = context.getMessage();SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();SOAPHeader header = envelope.getHeader();SOAPBody body = envelope.getBody();Node bn = body.getChildNodes().item(0);String partname = bn.getLocalName();if ("list".equals(partname) || "addUser".equals(partname)) {if (header == null) {// 添加一个错误信息SOAPFault fault = body.addFault();fault.setFaultString("头部信息不能为空!");throw new SOAPFaultException(fault);}Iterator<SOAPHeaderElement> iterator = header.extractAllHeaderElements();if (!iterator.hasNext()) {// 添加一个错误信息SOAPFault fault = body.addFault();fault.setFaultString("头部信息不正确!");throw new SOAPFaultException(fault);}while (iterator.hasNext()) {SOAPHeaderElement ele = iterator.next();System.out.println(ele.getTextContent());}}} catch (SOAPException e) {e.printStackTrace();}}return true;}


客户端,给方法添加Handle:

@Overridepublic boolean handleMessage(SOAPMessageContext context) {Boolean flag = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);if (flag) {try {SOAPMessage message = context.getMessage();SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();SOAPBody body = envelope.getBody();Node node = body.getChildNodes().item(0);String pn = node.getLocalName();if("list".equals(pn)||"addUser".equals(pn)) {SOAPHeader header = envelope.getHeader();if(header==null) header = envelope.addHeader();QName name = new QName("http://soap.lichen.cn/", "licenseInfo");header.addHeaderElement(name).setValue("client message .......");message.writeTo(System.out);}message.writeTo(System.out);} catch (SOAPException | IOException e) {e.printStackTrace();}}return true;}


测试方法:

public static void main(String[] args) {URL url = null;try {url = new URL("http://localhost:9988/ns?wsdl");} catch (MalformedURLException e1) {e1.printStackTrace();}QName name = new QName("http://soap.lichen.cn/", "MyServiceImplService");MyServiceImplService mis = new MyServiceImplService(url, name);IMyService ms = mis.getMyServiceImplPort();try {// ms.login("admin", "111");User user = new User();user.setId(2);user.setUsername("lisi");user.setNickname("李四");user.setPassword("123456");Holder<User> holder = new Holder<User>(user);ms.addUser(holder);System.out.println("TestClient......");} catch (SOAPFaultException e) {System.out.println(e.getMessage());}}


 

结果:

handleMessage方法注释到handle信息时,客户端控制台:

 

 

handleMessage方法添加handle信息时,客户端控制台:

 

服务端控制台没有异常: