Android-HttpURLConnection自动管理cookie

Volley那么好用的框架竟然没有内置对cookie的处理,自己搞一个!
public class MobCookieManager {//转载请标明出处:http://blog.csdn.net/goldenfish1919/article/details/46890245

	private MobCookieManager(){}

	/**
	 * 应用启动的时候调用,参考:{@link CookieManager#getInstance CookieManager.getInstance()}
	 * */
	public static void init(Context context){
		CookieSyncManager.createInstance(context);
	}

	public static String getCookie(String url){
		CookieManager cookieManager = CookieManager.getInstance();
		return cookieManager.getCookie(url);
	}

	/**
	 * http://stackoverflow.com/questions/16007084/does-android-webkit-cookiemanager-works-on-android-2-3-6
	 * */
	public static void setCookies(String url, Map<String, List<String>> headerFields) {
		if (null == headerFields) {
			return;
		}
		List<String> cookies = headerFields.get("Set-Cookie");
		if (null == cookies) {
			return;
		}
		CookieSyncManager.getInstance().startSync();
		for (String cookie : cookies) {
			setCookie(url, cookie);
		}
		CookieSyncManager.getInstance().sync();
	}

	private static void setCookie(String url, String cookie) {
		CookieManager cookieManager = CookieManager.getInstance();
		cookieManager.setAcceptCookie(true);

		if(cookie.indexOf("Expires") < 0){
			cookie = addExpireToCookie(cookie);
		}
		cookieManager.setCookie(url, cookie);
	}

	/**
	 * http://stackoverflow.com/questions/8547620/what-is-a-session-cookie
	 * */
	private static String addExpireToCookie(String cookie) {
		Date expireDate = new Date(new Date().getTime() + 24L*60*60*1000);
		String datestr =DateUtil.format(DateUtil.east8ToGmt(expireDate), DateUtil.FORMAT_GMT);
		String arr[] = cookie.split(";");
		StringBuilder sb = new StringBuilder();
		sb.append(arr[0]);
		sb.append("; ").append("Expires=").append(datestr);
		if(arr.length > 1){
			for(int i=1; i<arr.length; i++){
				sb.append(";").append(arr[i]);
			}
		}
		return sb.toString();
	}

}
</pre><pre name="code" class="java"><pre name="code" class="java">public class DateUtil {

	public static final String FORMAT_MDHM = "MM-dd HH:mm";
	public static final String FORMAT_YMD = "yyyy-MM-dd";
	public static final String FORMAT_YMDHM = "yyyy-MM-dd HH:mm";
	public static final String FORMAT_YMDHMS = "yyyy-MM-dd HH:mm:ss";
	public static final String FORMAT_GMT = "EEE, dd-MMM-yyyy HH:mm:ss 'GMT'";

	private static final String TAG = DateUtil.class.getSimpleName();
	private static final Locale DEFAULT_LOCALE = Locale.CHINA;

	private static ThreadLocal<Map<String, SimpleDateFormat>> threadLocal = new ThreadLocal<Map<String, SimpleDateFormat>>() {
        protected synchronized Map<String, SimpleDateFormat> initialValue() {
        	Map<String, SimpleDateFormat> map = new HashMap<String, SimpleDateFormat>();
        	map.put(FORMAT_MDHM, new SimpleDateFormat(FORMAT_MDHM, DEFAULT_LOCALE));
        	map.put(FORMAT_YMD, new SimpleDateFormat(FORMAT_YMD, DEFAULT_LOCALE));
        	map.put(FORMAT_YMDHM, new SimpleDateFormat(FORMAT_YMDHM, DEFAULT_LOCALE));
        	map.put(FORMAT_YMDHMS, new SimpleDateFormat(FORMAT_YMDHMS, DEFAULT_LOCALE));
        	map.put(FORMAT_GMT, new SimpleDateFormat(FORMAT_GMT, DEFAULT_LOCALE));
            return map;
        }
    };  

    private DateUtil(){}

    public static SimpleDateFormat getDateFormat(String format) {
    	Map<String, SimpleDateFormat> map = (Map<String, SimpleDateFormat>) threadLocal.get();
    	SimpleDateFormat sdf = map.get(format);
    	if(sdf != null){
    		return sdf;
    	}
		try{
			sdf = new SimpleDateFormat(format, DEFAULT_LOCALE);
			map.put(format, sdf);
		}catch(Exception e){
			MyLog.e(TAG, e);
		}
		return sdf;
    }  

    public static Date parse(String textDate, String format) {
    	if(textDate == null || textDate.length() <= 0){
    		return null;
    	}
    	try{
    		SimpleDateFormat sdf = getDateFormat(format);
    		if(sdf == null){
    			return null;
    		}
    		return sdf.parse(textDate);
    	}catch(Exception e){
    		MyLog.e(TAG, e);
    		return null;
    	}

    }  

	public static String format(Date date, String format){
		if(date == null){
			return null;
		}
		SimpleDateFormat sdf = getDateFormat(format);
		if(sdf == null){
			return null;
		}
		return sdf.format(date);
	}

	public static Date east8ToGmt(Date src){
		if(src == null){
			return null;
		}
		TimeZone srcTimeZone = TimeZone.getTimeZone("GMT+8");
	    TimeZone destTimeZone = TimeZone.getTimeZone("GMT");
		long targetTime = src.getTime() - srcTimeZone.getRawOffset() + destTimeZone.getRawOffset();
        return new Date(targetTime);
	}

}

注意:我们这里使用的android.webkit.CookieManager。



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

时间: 2024-11-25 18:50:36

Android-HttpURLConnection自动管理cookie的相关文章

Android - 软件自动更新的实现(转)

在客户端实现更新操作 涉及到三个技术: 1.xml文件的解析 2.HttpURLConnection连接 3.文件流I/O 这里创建一个解析xml文件的服务类:ParXmlService.java [java] view plaincopy package com.xiaowu.news.update; import java.io.InputStream; import java.util.HashMap; import javax.xml.parsers.DocumentBuilder; i

Android HttpURLConnection源码分析

Android HttpURLConnection源码分析 之前写过HttpURLConnection与HttpClient的区别及选择.后来又分析了Volley的源码. 最近又遇到了问题,想在Volley中针对HttpURLConnection添加连接池的功能,开始有点懵了,不知道HttpURLConnection要怎么加连接池, 虽然感觉这是没必要的,但是心底确拿不出依据.所以研究下HttpURLConnection的源码进行分析. 在使用的时候都是通过URL.openConnection(

【Android】Android程序自动更新

App自动更新的步骤可分为三步: 检查更新(如果有更新进行第2步,否则返回) 下载新版的APK安装包 安装APK 下面对这三步进行解释,其中会穿插相应代码,App自动更新的这三步全部被封装到了一个单独的Updater类中,可以直接拿来使用,我会在文章最后贴出源码github地址. Updater 使用示例 通过单一的类Updater可以方便的实现自动检查更新.下载安装包和自动安装,可以监听下载进度,可以自定义更新提示等.保存路径可以自由书写,如果路径中某个目录不存在会自动创建,流式API接口易于

Retrofit+OKHttp 教你怎么持久化管理Cookie

绪论 最近小编有点忙啊,项目比较紧,所以一直在忙活项目,继之前的自定义组件之后就没再写博客了,如果你没看到之前的自定义组件你可以看一下: Android自定义下拉刷新动画–仿百度外卖下拉刷新 Android自定义组合控件-教你如何自定义下拉刷新和左滑删除 效果还行,源码也已经传到我的Github上了. 那么今天小编来给大家分享点什么呢?对,就是它:Retrofit,话说Retrofit最近真的很火啊,Retrofit+OKHttp现在似乎已经成为了Android网络请求框架的主流框架了吧,小编之

Eclipse Android 代码自动提示功能

对于一个后端管理系统,最重要内容之一的就是登陆页了,无论是安全验证.用户在线记录.相关日志记录.单用户或多用户使用帐号控制等,都是在这个页面进行处理的. 1.在解决方案中创建一个Web项目,并将它设置为启动项 2.添加引用 3.添加WebManage文件夹与Login.aspx文件 4.添加登陆页面HTML代码 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx

C# 多线程的自动管理(线程池) 基于Task的方式

C# 多线程的自动管理(线程池) 在多线程的程序中,经常会出现两种情况:    1. 应用程序中线程把大部分的时间花费在等待状态,等待某个事件发生,然后给予响应.这一般使用 ThreadPool(线程池)来解决.     2. 线程平时都处于休眠状态,只是周期性地被唤醒.这一般使用 Timer(定时器)来解决. ThreadPool 类提供一个由系统维护的线程池(可以看作一个线程的容器),该容器需要 Windows 2000 以上系统支持,因为其中某些方法调用了只有高版本的Windows 才有的

第七章(插件的使用和写法)(7.4 jQuery UI 插件 7.5 管理Cookie的插件 --- Cookie)

7.4 jQuery UI 插件 7.4.1 jQuery UI 简介 jQuery UI 主要分为3个部分,交互.微件和效果差: ? 交互.这里都是一些与鼠标交互相关的内容,包括拖动(Draggable).置放(Droppable).缩放(Resizable).选择(Selectable)和排序(Sortable)等待.微件(Widget)中有部分是基于这些交互组件来制作的.此库需要一个 jQuery UI 核心库 ----- ui.core.js 支持. ? 微件.这里主要是一些界面的扩展.

SERVLETJSP学习(六)—— 状态管理-cookie

1. 状态管理-Cookie 1.1. 状态管理 1.1.1. 为什么需要状态管理 Web应用程序使用HTTP协议作为传输数据的标准协议,而HTTP协议是无状态协议,即一次请求对应一次响应,响应结束后连接即断开,同一个用户的不同请求对于服务器端来讲并不会认为这两个请求有什么关联性,并不会以此区分不同的客户端.但实际情况中还是需要服务器端能够区分不同的客户端以及记录与客户端相关的一些数据,所以状态管理能够做到不同客户端的身份识别. 1.1.2. 什么是状态管理 将客户端与服务器之间多次交互当做一个

Android如何使用读写cookie的方法

Android如何使用读写cookie的方法 可以使用SharedPreferences或者SQLite来保存用户信息 private static HashMap<String,String>  CookieContiner=new HashMap<String,String>() ;     /**  * 保存Cookie  * @param resp  */     public void SaveCookies(HttpResponse httpResponse)