当前位置: 首页 > news >正文

[android]-如何在向服务器发送request时附加已保存的cookie数据

[android]-如何在向服务器发送request时附加已保存的cookie数据

 

应用场景:
在开发android基于手机端+服务器端的应用时,登陆->获取用户信息->获取授权用户相关业务数据(如用户工作任务安排)
,此时就涉及到在登陆后必须把保存有用户已登陆的cookie数据(和服务器端使用cookie或session来判断用户是否登陆没关系,因为这两种方式,在客户端来说,都是通过保存cookie数据来实现的)一同发送到服务器端,不然,服务器端会认为你没有登陆,而不给提供用户工作任务安排的数据

我在工作中就遇到过这问题

一开始我是这样书写代码的

01import java.io.IOException;
02import java.net.SocketTimeoutException;
03import java.util.ArrayList;
04import java.util.List;
05import org.apache.http.HttpResponse;
06import org.apache.http.NameValuePair;
07import org.apache.http.client.methods.HttpPost;
08import org.apache.http.impl.client.AbstractHttpClient;
09import org.apache.http.impl.client.DefaultHttpClient;
10 
11 
12String result = "";
13/* HTTP Post */
14HttpPost httpRequest = new HttpPost(url);
15 
16List<NameValuePair> params = new ArrayList<NameValuePair>();
17params.add(new BasicNameValuePair(para, data));// jsonParameter
18 
19try {
20    // HTTP request
21    httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
22    // HTTP response
23 
24    DefaultHttpClient defaultHttpClient = new DefaultHttpClient();
25    // 请求超时
26    defaultHttpClient.getParams().setParameter(
27            CoreConnectionPNames.CONNECTION_TIMEOUT, 10000);
28    // 读取超时
29    defaultHttpClient.getParams().setParameter(
30            CoreConnectionPNames.SO_TIMEOUT, 10000);
31             
32 
33    // 发送请求
34    HttpResponse httpResponse = defaultHttpClient.execute(httpRequest);
35 
36    // 得到应答的字符串
37    // 200 ok
38    if (httpResponse.getStatusLine().getStatusCode() == 200) {
39        result = EntityUtils.toString(httpResponse.getEntity());
40         
41    }
42catch (ClientProtocolException e) {
43    System.out.println("ClientProtocolException:" + e.toString());
44    e.printStackTrace();
45    return null;
46catch (UnsupportedEncodingException e) {
47    System.out.println("UnsupportedEncodingException:" + e.toString());
48    e.printStackTrace();
49catch (SocketTimeoutException e) {
50    System.out.println("SocketTimeoutException:" + e.toString());
51    e.printStackTrace();
52catch (IOException e) {
53    System.out.println("IOException:" + e.toString());
54    e.printStackTrace();
55}

调用发现登陆成功后在获取工作任务时服务器提示未登陆,看来是没把cookie发送到服务器,由是找资料

修改后如下,有两个类
WebHelperResponse.java

1package com.demo.utils;
2 
3public class WebHelperResponse {
4    public String ResponseText = "";
5    public boolean IsOk = false;
6    public boolean IsError = false;
7    public String ErrMsg = "";
8}

WebHelper.java

view source
 
print ?
001package com.nt.android.app.slorders.utils;
002 
003import java.io.IOException;
004import java.net.SocketTimeoutException;
005import java.util.ArrayList;
006import java.util.List;
007import org.apache.http.HttpResponse;
008import org.apache.http.NameValuePair;
009import org.apache.http.client.CookieStore;
010import org.apache.http.client.entity.UrlEncodedFormEntity;
011import org.apache.http.client.methods.HttpPost;
012import org.apache.http.impl.client.AbstractHttpClient;
013import org.apache.http.impl.client.DefaultHttpClient;
014import org.apache.http.message.BasicNameValuePair;
015import org.apache.http.params.CoreConnectionPNames;
016import org.apache.http.protocol.HTTP;
017import org.apache.http.util.EntityUtils;
018 
019public class WebHelper {
020 
021    private static CookieStore cookieStore;
022 
023    public static WebHelperResponse postJson(String url, String data) {
024        return postData(url, data, "jsondata");
025    }
026 
027    public static WebHelperResponse postXml(String url, String data) {
028        return postData(url, data, "xmldata");
029    }
030 
031    // url参数中不允许有空格,否则将在new HttpPost(url)引发java.lang.IllegalArgumentException错误
032    public static WebHelperResponse postData(String url, String data,
033            String para) {
034        WebHelperResponse m_response = new WebHelperResponse();
035        m_response.IsOk = false;
036        m_response.IsError = false;
037 
038        String result = "";
039        /* HTTP Post */
040        HttpPost httpRequest = new HttpPost(url);
041        // param NameValuePair[]
042        // request.getParameter("name")
043        List<NameValuePair> params = new ArrayList<NameValuePair>();
044        params.add(new BasicNameValuePair(para, data));// jsonParameter
045 
046        try {
047            // HTTP request
048            httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
049            // HTTP response
050 
051            DefaultHttpClient defaultHttpClient = new DefaultHttpClient();
052            // 请求超时
053            defaultHttpClient.getParams().setParameter(
054                    CoreConnectionPNames.CONNECTION_TIMEOUT, 10000);
055            // 读取超时
056            defaultHttpClient.getParams().setParameter(
057                    CoreConnectionPNames.SO_TIMEOUT, 10000);
058            // 添加Cookie
059            if (cookieStore != null) {
060                defaultHttpClient.setCookieStore(cookieStore);
061            }
062 
063            // 发送请求
064            HttpResponse httpResponse = defaultHttpClient.execute(httpRequest);
065            int responseStatusCode = httpResponse.getStatusLine()
066                    .getStatusCode();
067            System.out.println("response statuscode:" + responseStatusCode);
068            // 得到应答的字符串
069            // 200 ok
070            if (responseStatusCode == 200) {
071                result = EntityUtils.toString(httpResponse.getEntity());
072                // 保存Cookie
073                cookieStore = ((AbstractHttpClient) defaultHttpClient)
074                        .getCookieStore();
075 
076                m_response.IsError = false;
077                m_response.IsOk = true;
078                m_response.ResponseText = result;
079 
080            else if (responseStatusCode == 404) {
081                // 找不到页面
082                m_response.IsError = true;
083                m_response.IsOk = false;
084                System.out.println("404:page not found.");
085                m_response.ErrMsg = "不存在此服务,请检查服务器地址配置";
086            else {
087                m_response.IsError = true;
088                m_response.IsOk = false;
089                System.out.println("error,responsestatuscode:"
090                        + responseStatusCode);
091                m_response.ErrMsg = "服务出错";
092            }
093        catch (SocketTimeoutException e) {
094            System.out.println("ClientProtocolException:" + e.toString());
095            e.printStackTrace();
096 
097            m_response.IsError = true;
098            m_response.IsOk = false;
099            m_response.ErrMsg = "连接错误:未能连接到服务器!";
100 
101        catch (IOException e) {
102            System.out.println("ClientProtocolException:" + e.toString());
103            e.printStackTrace();
104 
105            m_response.IsError = true;
106            m_response.IsOk = false;
107            m_response.ErrMsg = "错误:服务器未能提供服务!";
108 
109        }
110        return m_response;
111    }
112 
113}

相关文章:

  • 北信源内网安全管理管理系统
  • sharepoint excute power shell
  • python中PyQwt的使用
  • 重载输出操作符()时遇到的问题
  • CentOS 6系统下安装 JDK1.6
  • 安装graylog2日志服务器
  • javascript学习笔记之时间定制器
  • Fedora下安装Retext
  • Concurrent
  • 阿拉伯数字转中文数字表示[PHP]
  • oral_quiz-#扑克牌是不是顺子#
  • Android使用百度地图的注意点
  • 移动互联网金融的全方位服务时代已经到来
  • 再读《精通css》03:引入和注释
  • 长假结束了
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Linux链接文件
  • python_bomb----数据类型总结
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • TCP拥塞控制
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • Vim Clutch | 面向脚踏板编程……
  • 初探 Vue 生命周期和钩子函数
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 深入 Nginx 之配置篇
  • 为视图添加丝滑的水波纹
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 从如何停掉 Promise 链说起
  • (07)Hive——窗口函数详解
  • (1)(1.11) SiK Radio v2(一)
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (70min)字节暑假实习二面(已挂)
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (转)mysql使用Navicat 导出和导入数据库
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .NET 发展历程
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .net 中viewstate的原理和使用
  • .netcore如何运行环境安装到Linux服务器
  • .net访问oracle数据库性能问题
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • [codevs] 1029 遍历问题
  • [linux time命令学习篇] time 统计命令执行的时间
  • [Linux_IMX6ULL驱动开发]-基础驱动
  • [MySQL]视图索引以及连接查询案列
  • [nlp] 多语言大模型不同语种/语系数据的数据配比调节
  • [Noi2015]程序自动分析
  • [NOIP2004] 提高组 洛谷P1090 合并果子
  • [one_demo_9]判断数组是否递增