`

android WebView登录状态session id 和cookie同步

 
阅读更多
android客户端通过httpClient或者httpUrlConnection进行登录后,为了把登录状态同步到webView中,这时需要进行cookie的同步



一.cookie同步方式

下面是登录线程:

public class LoginThread extends Thread{
        
    private Handler loginHandler;
    
    public  LoginThread(Handler loginHandler) {
        this.loginHandler = loginHandler;
    }
    @Override
    public void run()
    {
        List<String> cookieLst = new ArrayList<String>();
        HttpParams httpParams = new BasicHttpParams();
        ConnManagerParams.setMaxTotalConnections(httpParams, 5);
        ConnManagerParams.setTimeout(httpParams, 15*1000);
        HttpConnectionParams.setSoTimeout(httpParams, 10*1000);
        HttpConnectionParams.setTcpNoDelay(httpParams, true);
        HttpPost httpPost = new HttpPost("http://192.168.1.107/cookie/login.php");
        List<NameValuePair> nvPairs = new ArrayList<NameValuePair>();
        nvPairs.add(new BasicNameValuePair("name", "lisi"));
        nvPairs.add(new BasicNameValuePair("age","22"));
        nvPairs.add(new BasicNameValuePair("gender", "男"));
        
        try {
            UrlEncodedFormEntity entity = new UrlEncodedFormEntity(nvPairs, HTTP.UTF_8);
            httpPost.setEntity(entity);
            HttpClient httpClient =  new DefaultHttpClient();
            HttpResponse httpResponse = httpClient.execute(httpPost);
            if(httpResponse!=null && httpResponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK)
            {
               String content = EntityUtils.toString(httpResponse.getEntity());
               Log.d("LOGIN", content);
               Header[] allHeaders = httpResponse.getAllHeaders();
               if(allHeaders!=null)
               {
                   //获取cookie的第一种方式
                   for (Header header : allHeaders)
                   {
                       Log.d("LOGIN", header.getName()+"="+header.getValue());
                       if("Set-Cookie".equalsIgnoreCase(header.getName()))
                       {
                           cookieLst.add(header.getValue());
                       }
                    }
               }
               //获取cookie的第二种方式
               AbstractHttpClient abstractHttpClient = (AbstractHttpClient) httpClient;
               CookieStore cookieStore = abstractHttpClient.getCookieStore();
               List<Cookie> cookies = cookieStore.getCookies();
               for (Cookie cookie : cookies)
               {
                   Log.d("LOGIN-COOKIE", cookie.getName()+"="+cookie.getValue()+",path="+cookie.getPath()+",domain="+cookie.getDomain()+",expires="+cookie.getExpiryDate());
                }
               
               if(loginHandler!=null)
               {
                   Message msg = new Message();
                   msg.obj = cookieLst;
                   msg.what = 200;
                   msg.setTarget(loginHandler);
                   msg.sendToTarget();
               }
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
下面是WebView主页面Activity

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public class Main extends Activity implements DownloadListener {
    
    private WebView mWebView;
    
    //extraHeaders经测试不可以同步cookie
    private Map<String, String> extraHeaders;
    
    private final String TAG = "WEB_VIEW";
    
    private final Handler loginHandler = new Handler(){
        
        @Override
        public void handleMessage(Message msg) {
            
            if(msg.what==200)
            {
                List<String> cookies =  (List<String>) msg.obj;
                if(cookies!=null)
                {  
                    syncCookieToWebView(cookies);
                    mWebView.loadUrl("http://192.168.1.107/cookie/read.php");
                }
            }else{
                super.handleMessage(msg);
            }
        }
        
    };
    
    @SuppressLint("SetJavaScriptEnabled")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mWebView = (WebView) findViewById(R.id.main_webview);
        WebSettings settings = mWebView.getSettings();
        settings.setAppCacheEnabled(true);
        settings.setCacheMode(WebSettings.LOAD_DEFAULT);
        settings.setGeolocationEnabled(true);
        settings.setUseWideViewPort(true);
        settings.setSaveFormData(true);
        settings.setSavePassword(true);
        settings.setSupportZoom(false);
        settings.setLoadsImagesAutomatically(true);
        settings.setBlockNetworkImage(false);
        if(android.os.Build.VERSION.SDK_INT>=11)
        {
            settings.setEnableSmoothTransition(true);
        }
        settings.setJavaScriptCanOpenWindowsAutomatically(false);
        settings.setAllowFileAccess(false);
        settings.setJavaScriptEnabled(true);
        String userAgent = settings.getUserAgentString();
        Log.d(TAG, userAgent);
        if(android.os.Build.VERSION.SDK_INT>=14)
        {
            mWebView.setFitsSystemWindows(true);
        }
        if(mWebView.isHardwareAccelerated())
        {
            mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
        }
        mWebView.setKeepScreenOn(true);
        extraHeaders = new IdentityHashMap<String, String>();
        
        mWebView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if(view!=null && !TextUtils.isEmpty(url))
                {
                    extraHeaders.put("control-cache", "no-cache,private");
                    extraHeaders.put("pragma", "no-cache,no-store");
                    extraHeaders.put("expires", "0");
                    view.loadUrl(url, extraHeaders);
                    return true;
                }
                return super.shouldOverrideUrlLoading(view, url);
            }
        });
        
        mWebView.setDownloadListener(this);
        
        //mWebView.loadUrl("http://shouji.baidu.com/software/?from=web_alad_multi");
        new LoginThread(loginHandler).start();
    }
    //销毁webView
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mWebView.clearFormData();
        mWebView.clearHistory();
        mWebView.destroy();
    }
    
    //监听文件下载,WebView不会自动下载,需要我们自己构建下载代码
    @Override
    public void onDownloadStart(String url, String userAgent,String contentDisposition, String mimetype, long contentLength)
    {
        Log.d(TAG, "url="+url);
        Log.d(TAG, "userAgent="+url);
        Log.d(TAG, "contentDisposition="+contentDisposition);
        Log.d(TAG, "mimetype="+mimetype);
        Log.d(TAG, "contentLength="+contentLength);
        
        //第一种下载方式是 自定义的http工具类
        //new DownloadThread(url,contentDisposition,mimetype,contentLength).start();
        
        
        //第二种下载方式是调用系统的webView,具有默认的进度条
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse(url));
        startActivity(intent);
        
    }
    /**
     * cookie同步
     */
    private void syncCookieToWebView(List<String> cookies)
    {
        CookieSyncManager.createInstance(Main.this);
        CookieManager cm = CookieManager.getInstance();
        cm.setAcceptCookie(true);
        if(cookies!=null)
        {
            for (String cookie : cookies)
            {
            cm.setCookie("http://192.168.1.107:80",cookie);//注意端口号和域名,这种方式可以同步所有cookie,包括sessionid
             }
        }
        CookieSyncManager.getInstance().sync();
    }
}


二.注意:平时开发中Cookie同步是最佳选项,但这并不意味着一定需要使用cookie同步,我们可以使用  token+用户id+登录时间校验码  进行同步登录



三.对于使用javaInterface进行同步登录的问题

javaInterface风险性很高,如果android平台是 4.2+比较安全,但4.2以下版本,安全性不容乐观,比如通过反射造成硬盘被读写的可能性很高!

在android 4.2中增加了 @javainterface注解,并且将公开的方法异步化,这样有效的控制了某些没必要公开的方法被无意间作为接口公开,导致js发射到硬盘的读写io类,从而发生文件被窃取,垃圾文件堆积,有害文件被下载等问题!



四.目前来说让所有人使用 4.2+以上版本可能性不大,但尽量少使用javainterface,转而使用  协议的方式,所谓协议,就是通信协议,我们可以分析url参数,从而进行webView和native代码的通信

mWebView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                
            //捕获url的参数值
            
            if(url.indexOf("login")>=0)
            {
                //客户端代码执行某部分操作----->执行完毕后通过url参数把执行结果返回webView
                
            }else if(url.indexOf("userCenter")>=0){
                //客户端代码执行某部分操作----->执行完毕后通过url参数把执行结果返回webView
            }
            return super.shouldOverrideUrlLoading(view, url);
            }
        });
当然,javainterface不推荐,但完全可以使用

?
1
view.loadUrl("javascript:dosometing("+"'参数'"+")");
分享到:
评论

相关推荐

    android cookie获取和设置,webView的cookie的同步

    当用户登录成功后,服务器通常会返回一个包含 `SessionId` 的 Cookie,该 `SessionId` 需要在后续的所有请求中携带。 示例代码如下: ```java DefaultHttpClient httpClient = new DefaultHttpClient(); ...

    android原生登录 +webview 记住登录状态

    所以往往需要将在native方法...这种情况在Android开发中比较常见,因为Android不会自动同步cookie到WebView。做iOS开发则不用担心这个问题,因为iOS内部已经实现了cookie同步.本文就是一个小的事例,从登录到同步cookie

    原生登录cookie保持提供webview使用

    这涉及到一个关键的技术点:如何保持和传递登录cookie,使得用户在原生应用登录后,WebView也能识别到这个登录状态,从而避免用户反复登录。本文将深入探讨这个主题,主要围绕"原生登录cookie保持提供webview使用"这...

    android的webView的登录实例

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中加载和显示网页内容。本实例将详述如何使用Android Studio 3.1.2版本,通过WebView来创建一个简单的登录界面,该界面使用本地HTML页面进行...

    Android webview QQ一键登录并向后台返回参数

    在Android开发中,WebviewQQ登录是一种常见的社交登录方式,它允许用户通过内置的WebView组件直接使用QQ账号进行登录,并将登录后的参数回传给应用的后台系统。这种方式简化了用户的登录流程,提高了用户体验,同时...

    Andriod中WebView加载登录界面获取Cookie信息并同步保存,使第二次不用登录也可查看个人信息。

    Android使用WebView加载登录的html界面,则通过登录成功获取Cookie并同步,可以是下一次不用登录也可以查看到个人信息,注:如果初始化加载登录,可通过缓存Cookie信息来验证是否要加载登录界面。Cookie信息包含了你...

    解决Android webview设置cookie和cookie丢失的问题

    解决Android webview设置cookie和cookie丢失的问题 Android webview是一个非常常用的技术,然而在使用中经常会遇到cookie丢失的问题,导致登陆失败等情况。今天,我们将探索解决Android webview设置cookie和cookie...

    实例详解Android Webview拦截ajax请求

    Android Webview 拦截 Ajax 请求的详细讲解 Android Webview 提供了页面加载及资源请求的钩子,但是对于 H5 的 Ajax 请求并没有提供干涉的接口。这意味着我们不能在 Webview 中干涉 JavaScript 发起的 HTTP 请求,...

    Android WebView 去除标题

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中加载和显示网页内容。有时候,我们可能希望去除WebView中的标题部分,以实现更自定义化的界面设计。本篇文章将详细探讨如何在Android的...

    Android webview加载网页.zip

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序内部加载和显示网页内容,无需跳转到外部浏览器。这个“Android webview加载网页.zip”文件可能包含了一个示例项目或者教程,帮助开发者理解...

    Android Webview滑动监听

    android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent" /&gt; ``` 然后在对应的Activity中初始化并加载网页: ```java WebView webView = findViewById(R.id....

    android webview播放网页视频

    在Android开发中,Webview是一个非常重要的组件,它允许我们加载和展示网页内容。当涉及到在Webview中播放网页视频时,这个问题可能会变得稍微复杂,因为Android原生的Webview并不总是支持所有现代HTML5视频特性。...

    Android webview调用摄像头扫描二维码

    Webview是Android SDK提供的一种视图组件,它能够加载和显示网页内容。在Android Studio中创建一个新的项目,我们需要在布局XML文件(如activity_main.xml)中添加一个WebView元素: ```xml &lt;WebView android:id=...

    Android Webview视频播放器

    在Android平台上,Webview是一个非常重要的组件,它允许开发者在原生应用中嵌入网页内容。这个项目"Android Webview视频播放器"是利用Webview来实现HTML5视频播放功能的示例。以下是对这个项目的详细解读: 1. **...

    Android webview 内存泄露的解决方法

    Android webview 内存泄露的解决方法 最近在activity嵌套webview显示大量图文发现APP内存一直在涨,没法释放内存,查了很多资料,大概是webview的一个BUG,引用了activity导致内存泄漏,所以就尝试传递...

    android webview 版本69.0

    在Android平台上,WebView是一个至关重要的组件,它允许开发者在应用程序中嵌入网页浏览功能,而无需启动完整的浏览器应用。在给定的标题“android webview 版本69.0”中,提到的是一个特定版本的WebView,即69.0。...

    通过css注入实现android webview的夜间模式

    在Android开发中,Webview是一个非常重要的组件,它允许我们加载和展示网页内容。而实现夜间模式是现代应用中常见的需求,特别是在保护用户视力和节省电池方面。本篇将详细介绍如何利用CSS注入来实现在Android ...

    Cookie 实现WebView自动登录

    1. 存储登录信息:当用户首次通过WebView成功登录后,服务器会设置带有登录状态的Cookie。此时,需要捕获这个登录成功的响应,将Cookie保存起来。 2. 恢复登录状态:当应用再次启动或重新打开WebView时,首先从本地...

Global site tag (gtag.js) - Google Analytics