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

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

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

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

01 import java.io.IOException;
02 import java.net.SocketTimeoutException;
03 import java.util.ArrayList;
04 import java.util.List;
05 import org.apache.http.HttpResponse;
06 import org.apache.http.NameValuePair;
07 import org.apache.http.client.methods.HttpPost;
08 import org.apache.http.impl.client.AbstractHttpClient;
09 import org.apache.http.impl.client.DefaultHttpClient;
10  
11  
12 String result = "";
13 /* HTTP Post */
14 HttpPost httpRequest = new HttpPost(url);
15  
16 List<NameValuePair> params = new ArrayList<NameValuePair>();
17 params.add(new BasicNameValuePair(para, data));// jsonParameter
18  
19 try {
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     }
42 catch (ClientProtocolException e) {
43     System.out.println("ClientProtocolException:" + e.toString());
44     e.printStackTrace();
45     return null;
46 catch (UnsupportedEncodingException e) {
47     System.out.println("UnsupportedEncodingException:" + e.toString());
48     e.printStackTrace();
49 catch (SocketTimeoutException e) {
50     System.out.println("SocketTimeoutException:" + e.toString());
51     e.printStackTrace();
52 catch (IOException e) {
53     System.out.println("IOException:" + e.toString());
54     e.printStackTrace();
55 }

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

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

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

WebHelper.java

001 package com.nt.android.app.slorders.utils;
002  
003 import java.io.IOException;
004 import java.net.SocketTimeoutException;
005 import java.util.ArrayList;
006 import java.util.List;
007 import org.apache.http.HttpResponse;
008 import org.apache.http.NameValuePair;
009 import org.apache.http.client.CookieStore;
010 import org.apache.http.client.entity.UrlEncodedFormEntity;
011 import org.apache.http.client.methods.HttpPost;
012 import org.apache.http.impl.client.AbstractHttpClient;
013 import org.apache.http.impl.client.DefaultHttpClient;
014 import org.apache.http.message.BasicNameValuePair;
015 import org.apache.http.params.CoreConnectionPNames;
016 import org.apache.http.protocol.HTTP;
017 import org.apache.http.util.EntityUtils;
018  
019 public 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 }

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

  1. 在向服务器发送请求时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接。)

    用VS2005+SQLSERVER2008开发C/S的程序,程序上线运行一段时间之后发现在某些功能偶尔出现如下的错误: 在向服务器发送请求时发生传输级错误. (provider: TCP 提供程序, ...

  2. System.Data.SqlClient.SqlException: 在向服务器发送请求时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接。) .

    今天使用sql server 2008 R2管理器,进行SQL查询时,频率非常高的报错: System.Data.SqlClient.SqlException: 在向服务器发送请求时发生传输级错误. ...

  3. 只要访问的地址匹配cookie的地址时候 发送request请求时候 会携带上该cookie

    只要访问的地址匹配cookie的地址时候 发送request请求时候 会携带上该cookie

  4. Android使用HttpUrlConnection请求服务器发送数据详解

    HttpUrlConnection是java内置的api,在java.net包下,那么,它请求网络同样也有get请求和post请求两种方式.最常用的Http请求无非是get和post,get请求可以获 ...

  5. Android之网络----使用HttpClient发送HTTP请求(通过get方法获取数据)

    [正文] 一.HTTP协议初探: HTTP(Hypertext Transfer Protocol)中文 "超文本传输协议",是一种为分布式,合作式,多媒体信息系统服务,面向应用层 ...

  6. 页面跳转时中间参数保存(memcache/cookie)

    2014年1月19日 17:30:27 我这篇文章就说了一句话:用cookie保存页面间跳转时的参数 情景: 客服在后台操作的时候,经常从列表页进入到编辑页,编辑完信息后,还要自动返回之前的列表页 问 ...

  7. Hibernate中,将session绑定到线程时,在保存和查询数据的代码里,要正确的关闭session

    比如有个保存的方法 // 保存 public void save(){ Transaction t = XXX Session s = getSession.beginTransaction(); X ...

  8. Android 给服务器发送网络请求

    今天听得有点蒙,因为服务器的问题,这边建立服务器的话,学长用的是Idea建立的Spring之类的方法去搞服务器. 然后就是用Android去给这个服务器发送请求,大致效果还是懂的,就是像网站发送请求, ...

  9. Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)

    讲这个之前,我们先来说说get和post两种请求的区别吧!!! 1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.jsp?name=te ...

随机推荐

  1. Teach Yourself Scheme in Fixnum Days 6 recursion递归

    A procedure body can contain calls to other procedures, not least itself: (define factorial (lambda ...

  2. 【转】Linux內核驅動之GPIO子系統(一)GPIO的使用 _蝸牛

    原文网址:http://tc.chinawin.net/it/os/article-2512b.html 一 概述 Linux內核中gpio是最簡單,最常用的資源(和interrupt ,dma,ti ...

  3. Delphi流的操作 转

    一.流的概念 流简单说是建立在面向对象基础上的一种抽象的处理数据的工具,它定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员只需掌握对流进行操作,而不用关心流的另一头数据的真正流向.其实,流 ...

  4. jQuery手机触屏左右滑动切换焦点图特效代码

    原文地址:http://www.17sucai.com/pins/4857.html 演示地址:http://www.17sucai.com/pins/demoshow/4857 干净演示地址:htt ...

  5. hdu 4790 Just Random (思路+分类计算+数学)

    Problem Description Coach Pang and Uncle Yang both love numbers. Every morning they play a game with ...

  6. banner背景通栏

     background: #76CEF6 url("../images/bg.jpg") repeat-x 0 0;  -webkit-background-size: 100%; ...

  7. [RxJS] Changing Behavior with MapTo

    You often need streams to trigger different behaviors on the data based on which streams triggers. T ...

  8. [Cycle.js] Main function and effects functions

    We need to give structure to our application with logic and effects. This lessons shows how we can o ...

  9. asp.net cookie和session的详细使用

    cookie使用代码: //设置Cookie HttpCookie setCookie = new HttpCookie("test"); setCookie.Values.Add ...

  10. Jquery与DOM对象

    在第一次学习jquery中,常常会不能分辨DOM对象和Jquery对象,下面我们就简诉一下它们之间的关系和区别 1.DOM对象(Document Object Model) 文档对象模型,每一份DOM ...