httpclient的webservice客户端与session验证

欢迎来到:

webservcie是可以跨语言跨平台开发的一种技术,各种计算机语言都可以搭建服务器,同时各种计算机语言也可以开发客户端。只要有服务器,不管是用java还是C++抑或是php搭建的,其他语言都可以根据其开放的wsdl开发好客户端,然后调用其方法就像调用本地本项目的方法一样。 本文使用httpclient开发客户端,服务器例子依赖于文章:,如果有不明白的可以先看这些文章再看本文。本文在原来例子的基础上加上安全验证与session的使用与权限管理。 webservice的安全验证有很多方法,实现soapheader认证、集成windows身份验证、ip绑定验证等等。在此博主觉得,基础的,往往却是最有效的。本文使用过滤器验证登录身份,然后就像平时web登录后一样,在session中存放信息达到保持登录与权限的管理。第一:编写webservice客户端模板 首先咱们使用httpclient写一个能够访问webservice的客户端,详情可下载源码查看。 在此,因为wsdl、url、encoding还有就是返回的字段名在后面修改的可能性很大,所以使用配置文件存放他们的信息。

webservicetest.properties:

webservice.wsdl=http://localhost:8080/webServiceCXF/services/Service?wsdlwebservice.url=http://www.observer.com/servicewebservice.encoding=utf-8webservice.fieldname=result

然后包装一个类读取他们:com.observer.webservcie.util.ServicePropertiesUtil详情可以下载代码查看,咱们说正点。 在我的上一篇文章:中,介绍了js的webservice客户端的相关内容,其中XMLHttpRequest所起到的作用其实就相当于浏览器访问一个web服务器的作用一样,只不过它访问的时候向服务器推送了一段xml,并且访问的是webservice的url而已。 既然知道了这个原理,那么跟他一样在java中能够起到浏览器作用的httpclient能不能访问webservice的url进而访问webservice的方法呢?咱们做一下尝试,拭目以待。 因为后面加上session验证之后,客户端封装就要有所变化,所以在此先将客户端模板写出来,其中发送的xml模板完全可以使用soupui自动生成,soupri的使用参看介绍js的那篇文章。 TestWebServiceClient:

public class TestWebServiceClient {public static void main(String[] args) throws FormatException {ServicePropertiesUtil servicePropertiesUtil = new ServicePropertiesUtil(“webservicetest”);//获取读取配置文件的ServicePropertiesUtil类StringBuffer sb = new StringBuffer();sb.append(“<soapenv:Envelope xmlns:soapenv=’http://schemas.xmlsoap.org/soap/envelope/’ xmlns:ser='”+servicePropertiesUtil.getWebServiceUrl()+”‘>”);sb.append(“<soapenv:Header/>”);sb.append(“<soapenv:Body>”);sb.append(“<ser:getGradeName>”);sb.append(“<toid>”); sb.append(123); sb.append(“</toid>”);sb.append(“</ser:getGradeName>”);sb.append(“</soapenv:Body>”);sb.append(“</soapenv:Envelope>”);//访问webservcie时需要用到的xmlHttpClient httpClient = new HttpClient();//新建一个HttpClient类PostMethod postMethod=new PostMethod(servicePropertiesUtil.getWebServiceWsdl());postMethod.setRequestHeader(“SOAPAction”,”http://dao.wfservice.ws.emolay.com”);String html = null;try {String out = sb.toString();postMethod.setRequestEntity(new StringRequestEntity(out, “text/xml”,servicePropertiesUtil.getWebServiceEncoding()));//设置需要推送的数据httpClient.executeMethod(postMethod);//访问webservciehtml=postMethod.getResponseBodyAsString();//获取访问webserivce反馈的xmlpostMethod.releaseConnection();} catch (HttpException e) {e.printStackTrace();throw new FormatException(“连接异常1”, “服务器正在维护中,请稍后再试,或者联系服务器维护人员进行处理”);} catch (IOException e) {throw new FormatException(“连接异常2”, “服务器正在维护中,请稍后再试,或者联系服务器维护人员进行处理”);}Document doc=Jsoup.parse(html);//使用jsoup解析xml,得到webservice返回的数据Elements elements=doc.select(servicePropertiesUtil.getWebServiceFieldname());//根据webservcie的配置,解析xml中的数据String [] datas = new String[elements.size()];int i = 0;for(Element ele:elements){datas[i] = ele.text();i++;}//输出数据for(String d : datas){System.out.println(d);}}}

技术上的东西在注释已经写的很清楚了,这里就不多说了,服务器使用依赖的服务器webServiceCXF,部署服务器到tomcat后,运行这里的main方法,的到结果:“is succeed”;证明客户端代码编写正确,同时也证明了,httpclient是可以访问webservice的。第二:改造服务器 首先咱们将服务器改个名,改为:webServiceCXFSession 在此,也许会有人想,如果在webservice中定义一个登录的方法,webserivce访问这个方法的时候就必须不能被拦截,但是过滤器中是不可能知道你的webservice是要访问什么方法的,只有到了webservice解析完传过来的xml才能知道,这时候就矛盾了,怎么办呢?在此,博主起初是想在传过来的头文件中加上一个参数(如islogin),然后在过滤器中得到这个头文件信息,然后根据这个头文件信息进行判断是否放行。但是这时候又出现问题了,要是别人重写了客户端,网站空间,把所有的方法传过来的这个islogin全部都改为true,其他都不变,那也可以不用验证就进入webservcie。最后,博主觉得,直接在过滤器中进行判断登录即可,而登录的用户名密码可以使用头文件的形式传过来。 好了,登录的问题解决了,使用过滤器登录了之后,我们就可以在islogin为false时判断session中是否已经登录了,session中也的确放进了用户信息,但是要怎样才能在webservice的方法中的到session中的信息,进而判断其权限呢?在此就要用到博主的上一篇文章中提到的一个类了,该类为:java.lang.ThreadLocal,简单的解释就是:每个不同线程访问的都是不同的副本(原理上是否这样暂且不管,只要知道达到了这个效果就成),详情可看API或上一篇文章:;我们在访问webservice的过程其实就像访问servlet,以多线程的方式访问,但是一旦进到了服务器,那么访问过滤器与访问webservice的是同一个线程。那么好,只要我们在webservcie实现类中定义一个ThreadLocal,其中放着session,然后在webservcie进入与出来时把session放进与移除,那么在不同用户访问webservcie都可以得到不同的自己的session,然后在方法里面判断其权限即可,如下所示 GradeServiceImpl中:

private static final ThreadLocal<HttpSession> threadLocal =new ThreadLocal<HttpSession>();public static void setHttpSession(HttpSession session){threadLocal.set(session);}public static void removeSession(){threadLocal.remove();}/*** 验证权限,如果不是admin用户,返回状态码”-1″表示没有权限访问该方法*/public String getGradeName(long toid) {HttpSession session = threadLocal.get();String user = (String)session.getAttribute(“user”);if(“admin”.equals(user)){System.out.println(“业务逻辑”);}else{return “-1”;}return “is succeed”;}有人说,幸福是一种人生的感悟,一种个人的体验。

httpclient的webservice客户端与session验证

相关文章:

你感兴趣的文章:

标签云: