Hybrid--webview session保持--2
来源:互联网 发布:个人怎么在淘宝卖食品 编辑:程序博客网 时间:2024/05/17 22:03
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。不要问我为什么,你知道请告诉我。
- Hybrid--webview session保持--2
- hybrid优化&webview加速
- session保持
- Hybrid--WebView中使用Ajax
- WebView整合,Hybrid Apps起始
- Android Hybrid 和 WebView 解析
- Android Hybrid 和 WebView 解析
- Hybrid app开发获取webview屏幕宽度
- Android Hybrid混合开发(Webview+JSBridge)简介
- Android hybrid 开发实践(android webview)
- 保持Session的有效期
- 保持用户状态Session
- HttpWebRequest 保持session
- 状态保持-Session
- android实现session保持
- HttpWebRequest 保持session
- Session和数据保持:
- android实现session保持
- 数据结构(Java)——查找和排序(4)
- 线程锁笔记
- IOS6 自动布局 入门(1)
- Python 实现简单 Web 服务器
- jsp修改example5-6
- Hybrid--webview session保持--2
- Python 知识点 记录 日积月累
- HTML5游戏制作之路_07_egret的声音播放的三种方式
- 类的设计
- 使用 pyinstaller 打包 Python 程序为可执行文件
- ajax基础(2)封装
- UVa 12123 - Magnetic Train Tracks
- IOS--Auto Layout
- VC++ VFW 视频捕获