Android中与服务器共享cookie的实现

一、实现步骤:
(1)创建一个类(类的名字进行自定义)
(2)把类进行使用单例模式进行封装,并使用HttpClient进行获取请求登录接口的Cookie,以及登录后返回的json数据
(3)将cookie保存到SharedPreferences中,进行封装SharedPreferencesUtils工具类,保存成永久的cookie
(4)传入登录接口,用户名和密码(使用post请求进行提交为了安全起见)
(5)得到登录返回的响应码(code值判断是否是登录成功,还是登录失败)
(6)当登录成功后跳转到主页面,主页面功能是由Html5进行编写的
(7)在加载Html5页面之前进行设置登录接口中获取的cookie
(8)进行加载Html页面网址,设置与JavaScript可以交互

二:具体的代码操作进行来实现
(1)创建一个类(类的名字进行自定义)
创建了一个类,名字叫做HttpCookie
(2)把类进行使用单例模式进行封装,并使用HttpClient进行获取请求登录接口的Cookie,以及登录后返回的json数据

//初始化对象
    public static volatile HttpCookie httpCookie;
    private static HttpClient httpClient;

    private HttpCookie() {
        //获取HttpClient对象
        httpClient = new DefaultHttpClient();
    }


    /**
     * 使用单例模式获取对象
     *
     * @return
     */
    public static HttpCookie getInstance() {
        if (httpCookie == null) {
            synchronized (HttpCookie.class) {
                if (httpCookie == null) {
                    httpCookie = new HttpCookie();
                }
            }
        }
        return httpCookie;
    }

    /**
     * 获取登录信息
     *
     * @param loginname 输入的用户名
     * @param password  输入的密码
     */
    public static String post(Context context, String url, String loginname, String password) {


        //post请求方式
        HttpPost httpPost = new HttpPost(url);

        //创建集合
        List<NameValuePair> list = new ArrayList<>();

        //添加属性
        list.add(new BasicNameValuePair("loginName", loginname));
        list.add(new BasicNameValuePair("password", password));

        try {
            //将属性设置到请求中
            httpPost.setEntity(new UrlEncodedFormEntity(list));

            //得到HttpResponse对象,获取到响应的结果
            HttpResponse response = httpClient.execute(httpPost);

            if (response.getStatusLine().getStatusCode() == 200) {

                //得到AbstractHttpClient对象
                AbstractHttpClient abstractHttpClient = (AbstractHttpClient) httpClient;

                //得到List<Cookie>
                List<Cookie> cookies = abstractHttpClient.getCookieStore().getCookies();

                for (Cookie cookie : cookies) {


                    String s = cookie.getName() + "=" + cookie.getValue() + " ; domain=" + cookie.getDomain();
                    Log.d("tag", "post: " + s);
                    Log.d("tag", "post: " + "name=" + cookie.getName() + "value=" + cookie.getValue());
                    //把获取的cookie存到 SharedPreferences 中
                    SharedPreferencesUtils.saveStr(context, "cookie", s);
                    //设置请求头
                    httpPost.setHeader("Cookie", cookie.getName() + "=" + cookie.getValue());
                }

                //得到HttpEntity对象
                HttpEntity entity = response.getEntity();
                //得到内容
                String content = EntityUtils.toString(entity);
                Log.d("tag", "content: " + content);
                //返回请求后的结果
                return content;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


        return null;
    }

(3)将cookie保存到SharedPreferences中,进行封装SharedPreferencesUtils工具类,保存成永久的cookie

进行封装SharedPreferencesUtils工具类

public class SharedPreferencesUtils {

    /**
     * 保存对象
     * @param context
     * @param key
     * @param value
     */
    public static  void  saveStr(Context context,String key, String value){

            //得到SharedPreferences对象
            SharedPreferences cookie = context.getSharedPreferences("cookie", Context.MODE_PRIVATE);
            //得到Editor对象
            SharedPreferences.Editor edit = cookie.edit();
            //放入数据
            edit.putString(key,value);
            edit.commit();

    }

    /**
     * 获取对象
     * @param context
     * @param key
     * @return
     */
    public static String getStr(Context context,String key){
        //得到SharedPreferences对象
        SharedPreferences cookie = context.getSharedPreferences("cookie", Context.MODE_PRIVATE);

        String cookieString = cookie.getString(key, "");
        return cookieString;
    }
}

(4)传入登录接口,用户名和密码(使用post请求进行提交为了安全起见)

登录按钮监听里的内容

//用户名
user = et_you_user.getText().toString().trim();
//密码
pwd = et_you_pwd.getText().toString().trim();
if (TextUtils.isEmpty(user)) {
    Toast.makeText(this,"用户名不能为空",Toast.LENGTH_SHORT).show();
    return;
}
if (TextUtils.isEmpty(pwd)) {
   Toast.makeText(this,"密码不能为空",Toast.LENGTH_SHORT).show();
    return;
}
//进行获取数据,传入的用户名和密码
getData(user,pwd);


获取数据的方法


/**
 * 获取请求登录成功后返回的数据
 * @param user 用户名
 * @param pwd 密码
 */
private void getData(final String user, final String pwd) {
    new Thread(){
        @Override
        public void run() {
            super.run();
            //获取到请求后的数据   参数一: 请求的网址   参数二:用户名   参数三  : 密码
            String content = HttpCookie.post(MainActivity.this, "http://192.168.1.13:8080/learner/login.do", user, pwd);
            //得到解析数据
            LoginBean loginBean = MyApplication.gsonUtils.gsonToBean(content, LoginBean.class);

(5)得到登录返回的响应码(code值判断是否是登录成功,还是登录失败)
            //得到请求码
            String code = loginBean.getCode();
            //得到消息
            String msg = loginBean.getMsg();
            Message message = Message.obtain();
            message.what=Integer.valueOf(code);
            message.obj=msg;
            mainhandler.sendMessage(message);
        }
    }.start();
}

(6)当登录成功后跳转到主页面,主页面功能是由Html5进行编写的

class MainHandler extends Handler{

    //开启一个弱引用
    WeakReference<Activity> mActivityReference;
    MainHandler(Activity activity){
        mActivityReference= new WeakReference<Activity>(activity);
    }

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        //得到当前的activity
        Activity activity = mActivityReference.get();

        if (activity != null){

            //得到请求码
            int code = msg.what;
            String meessage= (String) msg.obj;

            switch (code){
                //登录成功
                case 0:
                    Toast.makeText(activity,meessage,Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(activity,SecondActivity.class);
                    startActivity(intent);
                    break;
                //登录失败
                case 1:
                    Toast.makeText(activity,meessage,Toast.LENGTH_SHORT).show();
                    break;
            }

        }
    }
}

(7)在加载Html5页面之前进行设置登录接口中获取的cookie

我这里是SecondActivity,进行设置cookie的操作

/**
 * 设置cookie
 */
private void setWebviewCookie() {

    //得到Cookie对象
    String cookie = SharedPreferencesUtils.getStr(this, "cookie");
    Log.d("tag", "setWebviewCookie: "+cookie);
    CookieSyncManager.createInstance(this);
    //得到CookieManager对象
    CookieManager cookieManager = CookieManager.getInstance();
    //移除当前的消息
    cookieManager.removeAllCookie();
    //设置支持cookie
    cookieManager.setAcceptCookie(true);
    //进行设置cookie 参数一:登录接口的网址  参数二: 获取的cookie
    cookieManager.setCookie("http://192.168.1.13:8080/learner/login.do",cookie);
    //进行开始同步操作
    CookieSyncManager.getInstance().sync();
}

(8)进行加载Html页面网址,设置与JavaScript可以交互

1、找到控件的id

/**
 * 初始化控件视图
 */
private void initview() {
    webview = (WebView) findViewById(R.id.webview);
}

2、加载网址,并进行可以与JavaScript交互

webview.loadUrl("http://192.168.1.13:8080/learner/html/main.html");

WebSettings settings = webview.getSettings();
settings.setJavaScriptEnabled(true);

这样,就完成了与服务器进行共享(同步)cookie的操作

点击下载源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值