在进行程序开发的过程中,遇到一个问题,怎么保持会话。

因为一帮进行方法调用很少涉及到即时身份验证的。

例如:

1:客户端登录后服务端保存登录用户信息;

2:客户端持有验证通过key再次请求;

3:服务端得到key对比session存储key进行身份验证。

问题来了,请求服务,请求完成后,为了节约服务器资源,会断开连接,服务端如何识别是哪次请求的session呢?

这个时候就需要在第一次请求时,服务端返回sessionkey ,客户端再次请求时再请求头部使用此sessionkey表面身份,

在java端的方法如下:

public class WSHelper implements Runnable {
private static ExecutorService pool = Executors.newSingleThreadExecutor(); private static final String TAG = "WSHelper"; // 设置webservices的超时时长
private static final int ACCESS_TIMEOUT = 15000; private static String sessionId ; private WSParams mPs;
private WSCallBack mCallback; public static void setSessionId(String id){
sessionId = id;
} private WSHelper( WSParams ps , WSCallBack callback){
mPs = ps;
mCallback = callback;
}
//namespace:命名空间(http://www.ulife.com.cn/)
//methodName:方法名称
//url:服务调用地址(http://192.168.0.250/WebService/UHomeStationService.asmx)
//params:参数 public static Object callWebService(String nameSpace, String methodName, String url, Map<String, Object> params) {
final String soapAction = nameSpace + methodName;

        Log.e(TAG, "#开始调用WebServices → nameSpace= " + nameSpace + "; methodName= " + methodName
+ " url= " + url + "; sessionId="+ sessionId +"; params= " + params); // 1.创建数据对象 参数1:webServices命名空间 2:要访问的WebServices名称
SoapObject request = new SoapObject(nameSpace, methodName); // 2.创建信封对象
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true; // .net 支持
envelope.bodyOut = request; // 添加输出参数 // 添加要传递的websercice的参数
if (params != null && !params.isEmpty()) {
for (Iterator<Entry<String, Object>> it = params.entrySet().iterator(); it.hasNext();) {
Map.Entry<String, Object> e = it.next();
request.addProperty(e.getKey(), e.getValue());
}
} // 3.创建运输机对象对象
HttpTransportSE httpTransportSE = new HttpTransportSE( url , ACCESS_TIMEOUT );
httpTransportSE.debug = true;
Object object = null;
try {
List<HeaderProperty> headers = null;
if ( sessionId != null ){
headers = new ArrayList<HeaderProperty>();
headers.add(new HeaderProperty("Cookie" , "ASP.NET_SessionId=" + sessionId));
}
// 4.开始请求WebServices 参数1为 Action地址 (命名空间 + WebServices名称) 参数2为 信封对象
httpTransportSE.call(soapAction, envelope , headers);       // 5 .获得WebServices返回数据
object = envelope.getResponse();
} catch (Exception e) {
e.printStackTrace();
}
Log.e(TAG, "###WebServices → result = " + object);
return object;
} public static void callWS( WSParams ps , WSCallBack callback){
new Thread(new WSHelper(ps , callback)).start();
} public static void callWSSingleThread( WSParams ps , WSCallBack callback){
pool.execute(new WSHelper(ps , callback));
} public static boolean checkNetAndCallWS(Context context, WSParams ps, WSCallBack callback){
if ( NetUtil.checkNetwork(context)){
new Thread(new WSHelper(ps , callback)).start();
} else {
Toast.makeText(context, R.string.wang_luo_bu_ke_yong, Toast.LENGTH_SHORT).show();
return false;
}
return true;
} public static class WSParams {
public WSParams(String nameSpace, String methodName, String url, Map<String, Object> params){
this.nameSpace = nameSpace;
this.methodName = methodName;
this.url = url;
this.params = params;
} public String nameSpace;
public String methodName;
public String url;
public Map<String, Object> params;
} public interface WSCallBack{
void callBack(Object obj);
} @Override
public void run() {
try {
Object obj = callWebService(mPs.nameSpace , mPs.methodName , mPs.url , mPs.params);
if ( mCallback != null )
mCallback.callBack(obj);
} catch (Exception e) {
Log.e(TAG, "callback error!", e);
}
} public static String filterValue(Object value){
String str = null;
if ( value != null ){
str = value.toString();
if ( "".equals(str) || "anyType{}".equals( str ) )
str = null ;
}
return str;
}
}

java访问webservce,保持会话,服务端保存session验证的更多相关文章

  1. 使用nodejs和Java访问远程服务器的服务

    既然这篇文章用的是nodejs和Java访问远程服务器的服务,那么咱们先用另一门编程语言,SAP的ABAP(我日常工作使用得最多的编程语言)来开发一个服务吧. 这是我用ABAP编程语言实现服务的类:Z ...

  2. .Net之使用Jquery Ajax通过FormData对象异步提交图片文件到服务端保存并返回保存的图片路径

    前言: 首先对于图片上传而言,在我们的项目开发中可以说出现的频率是相当的高的.这篇文章中,我将要描述的是在我们.Net中如何使用Jquery Ajax通过FormData对象异步提交图片文件到后台保存 ...

  3. Java 实现Redis客户端,服务端

    Java 实现Redis客户端,服务端 1.Java实现Redis发布订阅 1.1实例 2.[Redis]Java实现redis消息订阅/发布(PubSub) 3.java实现 redis的发布订阅 ...

  4. Java通过URL 从web服务端获取数据

    1.Java 通过HttpURLConnection Post方式提交json,并从服务端返回json数据 package Demo.Test; import java.io.ByteArrayOut ...

  5. java网络编程客户端与服务端原理以及用URL解析HTTP协议

    常见客户端与服务端 客户端: 浏览器:IE 服务端: 服务器:web服务器(Tomcat),存储服务器,数据库服务器. (注:会用到Tomact服务器,在webapps下有一个自己创建的目录myweb ...

  6. Java网络编程(TCP协议-服务端和客户端交互)

    客户端: package WebProgramingDemo; import java.io.IOException; import java.io.InputStream; import java. ...

  7. java实现xml-rpc客户端和服务端

    客户端代码: package test_xmlrpc.test; import java.net.URL;import java.util.ArrayList;import java.util.Lis ...

  8. java工具类(一)之服务端java实现根据地址从百度API获取经纬度

    服务端java实现根据地址从百度API获取经纬度 代码: package com.pb.baiduapi; import java.io.BufferedReader; import java.io. ...

  9. TCP客户端图片上传服务端保存本地示例

    //TCP客户端public class TCPClient { public static void main(String[] args)throws IOException { Socket s ...

随机推荐

  1. java面向对象编程--第十一章 异常处理

    1.异常:描述出错信息的对象. 字节码校验时,如发生错误,则会抛出异常. 2.所有异常的父类是Exception,异常可以捕获,可以处理. 所有错误的父类是Error,错误可以捕获,但不能处理. Th ...

  2. java转义字符探究恢复

    今天工作的时候,遇到了个奇怪的问题,是关于字符串转义与替换的.最后终于解决了,特总结下. 小demo, package com.westward; public class Demo { /** * ...

  3. sql语句查询重复的数据

    查找所有重复标题的记录: SELECT *FROM t_info aWHERE ((SELECT COUNT(*)FROM t_infoWHERE Title = a.Title) > 1)OR ...

  4. js计算日期的前几天的日期

    月份0---11 var date = new Date(year,fenye_arr[0]-1,fenye_arr[1]);            miao=date.getTime(); var ...

  5. HDU 1698 区间更新

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. Pogo-Cow

    题目大意: 给出直线上N个点的坐标和分数,任意选一个点出发,每次只能跳到另外一个点上并获得相应的分数,且每次跳的方向要相同,本次跳的距离不小于上次跳的距离.  求最大得分.   N<=1000. ...

  7. ROS的文件系统 (二)

    ROS的文件系统的基本概念, ROS文件系统中的两个最基本的概念:Package和Manifest,即包和清单文件. Package是组织ROS代码的最基本单位,每一个Package都可以包括库文件, ...

  8. WP8.1 Study4:WP8.1中控件集合应用

    1.AutoSuggestBox的应用 在xaml里代码可如下: <AutoSuggestBox Name="autobox" Header="suggestion ...

  9. 使用jsTree动态加载节点

    因为项目的需要,需要做一个树状菜单,并且节点是动态加载的,也就是只要点击父节点,就会加载该节点下的子节点. 大致的效果实现如下图: 以上的实现就是通过jsTree实现的,一个基于JQuery的树状菜单 ...

  10. 将table导出为Excel的标准无乱码写法

    导出为Excel有很多种写法,对于一些复杂的格式,笔者喜欢在后台先拼成一个<table>,再使用Response输出. 如果数据中包含中文或者一些特殊字符,可很多不规范的写法都会导致页面乱 ...