[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; |
14 |
HttpPost httpRequest = new HttpPost(url); |
16 |
List<NameValuePair> params = new ArrayList<NameValuePair>(); |
17 |
params.add(new BasicNameValuePair(para, data));// jsonParameter |
21 |
httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); |
24 |
DefaultHttpClient defaultHttpClient = new DefaultHttpClient(); |
26 |
defaultHttpClient.getParams().setParameter( |
27 |
CoreConnectionPNames.CONNECTION_TIMEOUT, 10000); |
29 |
defaultHttpClient.getParams().setParameter( |
30 |
CoreConnectionPNames.SO_TIMEOUT, 10000); |
34 |
HttpResponse httpResponse = defaultHttpClient.execute(httpRequest); |
38 |
if (httpResponse.getStatusLine().getStatusCode() == 200) { |
39 |
result = EntityUtils.toString(httpResponse.getEntity()); |
42 |
} catch (ClientProtocolException e) { |
43 |
System.out.println("ClientProtocolException:" + e.toString()); |
46 |
} catch (UnsupportedEncodingException e) { |
47 |
System.out.println("UnsupportedEncodingException:" + e.toString()); |
49 |
} catch (SocketTimeoutException e) { |
50 |
System.out.println("SocketTimeoutException:" + e.toString()); |
52 |
} catch (IOException e) { |
53 |
System.out.println("IOException:" + e.toString()); |
调用发现登陆成功后在获取工作任务时服务器提示未登陆,看来是没把cookie发送到服务器,由是找资料
修改后如下,有两个类
WebHelperResponse.java
1 |
package com.demo.utils; |
3 |
public class WebHelperResponse { |
4 |
public String ResponseText = ""; |
5 |
public boolean IsOk = false; |
6 |
public boolean IsError = false; |
7 |
public String ErrMsg = ""; |
WebHelper.java
001 |
package com.nt.android.app.slorders.utils; |
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; |
019 |
public class WebHelper { |
021 |
private static CookieStore cookieStore; |
023 |
public static WebHelperResponse postJson(String url, String data) { |
024 |
return postData(url, data, "jsondata"); |
027 |
public static WebHelperResponse postXml(String url, String data) { |
028 |
return postData(url, data, "xmldata"); |
031 |
// url参数中不允许有空格,否则将在new HttpPost(url)引发java.lang.IllegalArgumentException错误 |
032 |
public static WebHelperResponse postData(String url, String data, |
034 |
WebHelperResponse m_response = new WebHelperResponse(); |
035 |
m_response.IsOk = false; |
036 |
m_response.IsError = false; |
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 |
048 |
httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); |
051 |
DefaultHttpClient defaultHttpClient = new DefaultHttpClient(); |
053 |
defaultHttpClient.getParams().setParameter( |
054 |
CoreConnectionPNames.CONNECTION_TIMEOUT, 10000); |
056 |
defaultHttpClient.getParams().setParameter( |
057 |
CoreConnectionPNames.SO_TIMEOUT, 10000); |
059 |
if (cookieStore != null) { |
060 |
defaultHttpClient.setCookieStore(cookieStore); |
064 |
HttpResponse httpResponse = defaultHttpClient.execute(httpRequest); |
065 |
int responseStatusCode = httpResponse.getStatusLine() |
067 |
System.out.println("response statuscode:" + responseStatusCode); |
070 |
if (responseStatusCode == 200) { |
071 |
result = EntityUtils.toString(httpResponse.getEntity()); |
073 |
cookieStore = ((AbstractHttpClient) defaultHttpClient) |
076 |
m_response.IsError = false; |
077 |
m_response.IsOk = true; |
078 |
m_response.ResponseText = result; |
080 |
} else if (responseStatusCode == 404) { |
082 |
m_response.IsError = true; |
083 |
m_response.IsOk = false; |
084 |
System.out.println("404:page not found."); |
085 |
m_response.ErrMsg = "不存在此服务,请检查服务器地址配置"; |
087 |
m_response.IsError = true; |
088 |
m_response.IsOk = false; |
089 |
System.out.println("error,responsestatuscode:" |
090 |
+ responseStatusCode); |
091 |
m_response.ErrMsg = "服务出错"; |
093 |
} catch (SocketTimeoutException e) { |
094 |
System.out.println("ClientProtocolException:" + e.toString()); |
097 |
m_response.IsError = true; |
098 |
m_response.IsOk = false; |
099 |
m_response.ErrMsg = "连接错误:未能连接到服务器!"; |
101 |
} catch (IOException e) { |
102 |
System.out.println("ClientProtocolException:" + e.toString()); |
105 |
m_response.IsError = true; |
106 |
m_response.IsOk = false; |
107 |
m_response.ErrMsg = "错误:服务器未能提供服务!"; |
- 在向服务器发送请求时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接。)
用VS2005+SQLSERVER2008开发C/S的程序,程序上线运行一段时间之后发现在某些功能偶尔出现如下的错误: 在向服务器发送请求时发生传输级错误. (provider: TCP 提供程序, ...
- System.Data.SqlClient.SqlException: 在向服务器发送请求时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接。) .
今天使用sql server 2008 R2管理器,进行SQL查询时,频率非常高的报错: System.Data.SqlClient.SqlException: 在向服务器发送请求时发生传输级错误. ...
- 只要访问的地址匹配cookie的地址时候 发送request请求时候 会携带上该cookie
只要访问的地址匹配cookie的地址时候 发送request请求时候 会携带上该cookie
- Android使用HttpUrlConnection请求服务器发送数据详解
HttpUrlConnection是java内置的api,在java.net包下,那么,它请求网络同样也有get请求和post请求两种方式.最常用的Http请求无非是get和post,get请求可以获 ...
- Android之网络----使用HttpClient发送HTTP请求(通过get方法获取数据)
[正文] 一.HTTP协议初探: HTTP(Hypertext Transfer Protocol)中文 "超文本传输协议",是一种为分布式,合作式,多媒体信息系统服务,面向应用层 ...
- 页面跳转时中间参数保存(memcache/cookie)
2014年1月19日 17:30:27 我这篇文章就说了一句话:用cookie保存页面间跳转时的参数 情景: 客服在后台操作的时候,经常从列表页进入到编辑页,编辑完信息后,还要自动返回之前的列表页 问 ...
- Hibernate中,将session绑定到线程时,在保存和查询数据的代码里,要正确的关闭session
比如有个保存的方法 // 保存 public void save(){ Transaction t = XXX Session s = getSession.beginTransaction(); X ...
- Android 给服务器发送网络请求
今天听得有点蒙,因为服务器的问题,这边建立服务器的话,学长用的是Idea建立的Spring之类的方法去搞服务器. 然后就是用Android去给这个服务器发送请求,大致效果还是懂的,就是像网站发送请求, ...
- Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)
讲这个之前,我们先来说说get和post两种请求的区别吧!!! 1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.jsp?name=te ...
随机推荐
- PhoneGap and Titanium
http://mobile.51cto.com/web-338270.htm http://www.udpwork.com/item/6117.html http://blog.cnbang.net/ ...
- rsyslog的ommsql模块如何连接MYSQL的非标准数据库端口?
搞了我半小个时查找资料..最后,在一个官方文档中找到他... http://www.rsyslog.com/doc/ommysql.html Sample: The following sample ...
- qtpanel
https://github.com/MadFishTheOne/qtpanel https://github.com/xiangzhai/qtpanel
- android 无法生成R文件的原因剖析
android 无法生成R文件 是件痛苦的事情,即使有时候你xml文件没有错误,他都无法生成.针对此问题,我总结以下几个方面的原因. 一.xml本身有错误 R.java这个文件是会自动生成的,但是如果 ...
- VC6.0 编译 gdlib 库
环境 WinXP, MSVC6.0 1 从 https://bitbucket.org/libgd/gd-libgd/downloads 下载最新版本 libgd 2 可以用 nmake 编译 w ...
- BOT、BT、PPP形式介绍(2)
BT1.什么是BT BT投资是BOT的一种变换形式,即Build-Transfer(建设—转让),政府通过特许协议,引入国外资金或民间资金进行专属于政府的基础设施建设,基础设施建设完工后,该项 ...
- [IOS]包含增删改查移动的tableView展示+plist文件保存+程序意外退出保存Demo
做一个tableView,包含增删改移动功能,并且修改值的时候,在按home键的时候会自动保存.如果可以的话使者保存自定义的类数组保存到plist中. 实现步骤: 1.创建一个SingleViewAp ...
- [置顶] 顿悟JAVA,自己实现Object的Clone的约束关系(上)
因protected 的理解,顿悟一些JAVA的原理,模拟了Object类的子类为什么在调用clone方法前实现Cloneable接口. 这里不解释 ,上代码先. 运行效果 文件结构 调用类 pack ...
- (转)iOS7界面设计规范(3) - UI基础 - 启动与退出
周二晚间来第三发,搞得好像今天是周六的赶脚.发掉之后再奖励自己一点冰啤酒吧,然后扑床去.天气热起来了,各位注意防暑降温呗.走起. 重要:这是针对于正在开发中的API或技术的预备文档(预发布版本).虽然 ...
- 开源 免费 java CMS - FreeCMS1.5-系统配置
下载地址:http://code.google.com/p/freecms/ 系统配置 从FreeCMS 1.2 开始支持 管理系统使用的配置项. 从左侧管理菜单点击系统配置进入. 从FreeCMS ...