Hybrid--webview session保持--2

原创 2015年11月19日 22:46:46

Hybrid–webview session保持

这篇博客想写好久了,最主要的原因是刚开始接触session保持这一块的时候各种小白,网上爬来的代码大多是废话一堆或者是直接坑人的,各种不爽,昨天刚好解决一个session保持问题,想来这段时间也整理的差不多,写在这里留给自己和需要的人—–熊猫卓 20151119

科普

我们需要了解:
–1.什么是session、什么事cookie?
我的观点,了解即可session是保存在服务器端,cookie保存在客户端,用来标记登录状态的。cookie中有一个值JSESSIONID=FHNHBXJJJXNAKDKCK (这个值我随便写的)与session中的sessionId保持一致服务器就会认为你是已经登录过的,无需再次登录,服务器会根据这个sessionId来找到相应的session,当然web开发中有一些参数会保存在session中比如登录用户信息等,服务器找到session也就找到了登录用户。相反如果找不到这个session或者session中无相关参数,那就认为用户没有登录或者由于超时session失效了,提示用户重新登录。
–2.webview中为什么需要session保持
这个问题就很明显了,如果不做session保持,web端网页访问大多是通过session过滤,没有session那任何页面你都无法访问。当然有的同学 说可以配置部分jsp、action不被过滤,可是你认为这样真的好吗??

代码说话

-1.sessionId的获取
或者应该说cookie的获取,我们需要获取cookie中的JSESSIONID,保存在客户端备用下次访问页面时带上cookie,告诉服务器已经登录过了,可以安全放行了。
作者在自己的项目中的实现思路是这样的:在web项目中写一个servlert或者action,用来实现登录。android通过urlConnection访问登录方法,登陆成功后的sessionId返回到客户端保存
上码

// 根据地址创建URL对象
URL url = new URL(spec);
// 根据URL对象打开链接
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
// 设置请求的方式
urlConnection.setRequestMethod("POST");
// 设置请求的超时时间
urlConnection.setReadTimeout(8000);                           urlConnection.setConnectTimeout(8000);
// 传递的数据
String data = "userName=" + URLEncoder.encode(username, "UTF-8")
                        + "&pwd=" + URLEncoder.encode(pwd, "UTF-8")+ "&device=" + URLEncoder.encode("mobile", "UTF-8");
// 设置请求的头
urlConnection.setRequestProperty("Connection", "keep-alive");
// 设置请求的头
urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// 设置请求的头
urlConnection.setRequestProperty("Content-Length", String.valueOf(data.getBytes().length));
// 设置请求的头
urlConnection.setRequestProperty("User-Agent","Mozilla/5.0   (Windows NT 6.3; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0");
urlConnection.setUseCaches(false);
urlConnection.setDoOutput(true); 
// 发送POST请求必须设置允许输
urlConnection.setDoInput(true); // 发送POST请求必须设置允许输入
//setDoInput的默认值就是true
//获取输出流
OutputStream os = urlConnection.getOutputStream();
os.write(data.getBytes());
os.flush();
String yyu = urlConnection.getResponseMessage();
if (urlConnection.getResponseCode() == 200) {
// 获取响应的输入流对象
InputStream is = urlConnection.getInputStream();
// 创建字节输出流对象
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 定义读取的长度
int len = 0;
// 定义缓冲区
byte buffer[] = new byte[1024];
// 按照缓冲区的大小,循环读取
 while ((len = is.read(buffer)) != -1) {
 // 根据读取的长度写入到os对象中
  baos.write(buffer, 0, len);
  }
  // 释放资源
  is.close();
  baos.close();
  // 返回字符串
  final String result = new String(baos.toByteArray());

以上我们已经成功获取到了sessionId,至于本地保存,读者可自行选择文件、sharedpreference、db来保存。

webview如何携带session访问页面

使用android的CookieSyncManage来实现cookie同步到url
具体的使用推荐读者去直接查看官方api
CookieSyncManager
简单总结网上的做法一般使用异步任务ansyTask来配合完成webview访问的耗时操作,这里省去不说有需要的自行度娘。
代码说话

public static void syncCookie(Context context, String url, String jessionid) {
    try {
        Log.v(TAG,"sfq-syncCookie:"+jessionid);
        CookieSyncManager.createInstance(context);
        CookieSyncManager.getInstance().startSync();
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);
        //有测试发现,清空cookie的操作会造成,cookie偶然性失效的现象
        cookieManager.removeSessionCookie();// 移除
        cookieManager.removeAllCookie();
        String oldCookie = cookieManager.getCookie(url);
       /* StringBuilder sbCookie = new StringBuilder();
       sbCookie.append(String.format("JSESSIONID=%s", jessionid));
        String cookieValue = sbCookie.toString();*/


        cookieManager.setCookie(url, jessionid);

        String newCookie = cookieManager.getCookie(url);
        if (newCookie != null) {
         //这里讲newCookie本地保存
        }
        CookieSyncManager.getInstance().sync();
    } catch (Exception e) {
        Log.e(TAG, e.toString());
    }
}

以上,作者将保持方法独立成一个工具类了,很方便使用有木有。

终极webview华丽集成

webview的使用代码来自网络博客

引用的博客地址

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Message;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class WebViewBase extends WebView {
    private static final String DEFAULT_URL = "http://www.ijinshan.com/";
    private Activity mActivity;
    public WebViewBase(Context context) {
        super(context);
        mActivity = (Activity) context;
        init(context);
    }

@SuppressLint("SetJavaScriptEnabled")
private void init(Context context) {
    WebSettings webSettings = this.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setSupportZoom(true);
    //webSettings.setUseWideViewPort(true);
    this.setWebViewClient(mWebViewClientBase);
    this.setWebChromeClient(mWebChromeClientBase);
    //本文作者熊猫卓提醒在这里加上session保持这句代码,大功告成。
    syncCookie(Context context, String url, String jessionid)
    this.loadUrl(DEFAULT_URL);
    this.onResume();
}

private WebViewClientBase mWebViewClientBase = new WebViewClientBase();

private class WebViewClientBase extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // TODO Auto-generated method stub
        return super.shouldOverrideUrlLoading(view, url);
    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        // TODO Auto-generated method stub
        super.onPageStarted(view, url, favicon);
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        // TODO Auto-generated method stub
        super.onPageFinished(view, url);
    }

    @Override
    public void onReceivedError(WebView view, int errorCode,
            String description, String failingUrl) {
        // TODO Auto-generated method stub
        super.onReceivedError(view, errorCode, description, failingUrl);
    }

    @Override
    public void doUpdateVisitedHistory(WebView view, String url,
            boolean isReload) {
        // TODO Auto-generated method stub
        super.doUpdateVisitedHistory(view, url, isReload);
    }
}

private WebChromeClientBase mWebChromeClientBase = new WebChromeClientBase();

private class WebChromeClientBase extends WebChromeClient {

    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        mActivity.setProgress(newProgress * 1000);
    }

    @Override
    public void onReceivedTitle(WebView view, String title) {
        // TODO Auto-generated method stub
        super.onReceivedTitle(view, title);
    }

    @Override
    public void onReceivedTouchIconUrl(WebView view, String url,
            boolean precomposed) {
        // TODO Auto-generated method stub
        super.onReceivedTouchIconUrl(view, url, precomposed);
    }

    @Override
    public boolean onCreateWindow(WebView view, boolean isDialog,
            boolean isUserGesture, Message resultMsg) {
        // TODO Auto-generated method stub
        return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg);
    }

}
}

需要也别特别说明下,本人在测试过程中发现直接某个由主页下边的二级jsp页面时session老丢失,百思不得七姐,后来发现首先访问一级jsp,然后通过点击一级jsp界面按钮的形式访问二级jsp就能够保持session。最终也没理解这是为什么难道不就是一个参数写在了url上的区别嘛。请了解这一块的好心人答疑解惑!感谢感谢
介于本人的实际问题,建议在使用syncCookie(Context context, String url, String jessionid)方法时参数url填写一级url,webview.loadUrl(targetUrl)中的url填写实际想要看到的url。不要问我为什么,你知道请告诉我。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

安卓学习笔记---AndroidWebview里设置Cookie遇到的坑

我们一般在使用WebView去加载H5界面的时候都会同步一下Cookie,一般的都会这么做: 在HttpClient中保存下来的Cookie怎么设置到WebView组件里,让WebView也保持住Co...

android采用post方式获取服务器数据

总结android 采用http请求访问网络并获取数据的步骤: 一.发送http请求,并传递相应的参数; 二.获取http返回的状态,根据返回的状态,如404错误,500错误,连接超时,请求异常等,并...

Android客户端写Cookie和内嵌的网页实现登录状态的同步

目前开发的Android应用内嵌了一个WebView来访问一些搞活动的商品网页,每次点击进行购买的时候都需要重新登录一次,用户体验感很不好。 因为网页端的登录是会先去读Cookie看是否保存有用户信...

Android中Http加载如何得到Cookie和 WebView 加载网页如何得到的Cookie

最近做项目在手机端登录Http请求和 WebView 记载登录获取Cookie信息,可转码查看信息。 Http请求获取Cookie信息: public static String request(...

Android用WebView获取sessionid保持登录状态

我们需要和web服务器保持登录状态。所以我们需要记录sessionid;我们将网页用webview加载之后,用CookieManager 来获取本地的cookies 。然后设置到webview里面去。...

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

上次说到的WebView还有一个遇到的比较难一点的问题没有回答上来。主要是关于在用webview的时候无法保存登录状态,下次打开网页还是会打开登录界面。有两三个朋友同时问到我这个问题,而刚刚好我也不懂...
  • hkq463
  • hkq463
  • 2016-07-15 12:51
  • 1141

Android Hybrid 学习过程 一 WebView和JavaScript交互

这几年web app和Hybrid app非常热,因为web本身适合复杂的布局而且效率也很高,但是本人是一个更喜欢android的,所以我就讲混合式app也就是Hybrid android。 这一次...

Android WebView(转一):Web App、Hybrid App、Native App的差异

转载地址:http://www.woshipm.com/pd/123646.html 目前主流应用程序大体分为三类:Web App、Hybrid App、 Native App。 一、W...

【cordova】hybrid app调试(同样适用于移动端浏览器或webview)

前几天发现身边好多人都不知道怎么调试cordova app,调页面的时候改一次看一下,甚至用alert来查看数据的值,这无疑极大地影响了工作效率和工作的心情,在此记录一下调试cordova app的方...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)