• java访问webservce,保持会话,服务端保存session验证


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

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

    例如:

    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;
        }
    }
  • 相关阅读:
    tornado开发学习之2.输入输出,数据库操作,内置模板,综合示例
    使用Python读取和写入mp3文件的id3v1信息
    在CentOS中部署Python和配置PyCharm开发环境
    Quartz Cron 表达式(时间格式的写法)
    使用Atomikos Transactions Essentials实现多数据源JTA分布式事务
    Grub4dos 硬盘引导 iso 文件
    NFS配置
    C++程序加载Flash动画
    在boost.foreach中操作迭代器
    WebContents类
  • 原文地址:https://www.cnblogs.com/PLifeCopyDown/p/3314557.html
Copyright © 2020-2023  润新知