来源:http://www.apkbus.com/android-20018-1-1.html
在最近写的一个Android中需要请求web服务器中的数据,有一个登录Activity,登录后会到MainActivity,这中间登录和MainActivity都需要请求jsp的jsonapi,所以要在网络请求中保持session的,研究了好半天才搞定。其实sesion在浏览器和web服务器直接是通过一个叫做name为sessionid的cookie来传递的,所以只要在每次数据请求时保持sessionid是同一个不变就可以用到web的session了,做法是第一次数据请求时就获取sessionid的值并保存在一个静态变量中,然后在第二次请求数据的时候要将这个sessionid一并放在Cookie中发给服务器,服务器则是通过这个sessionid来识别究竟是那个客户端在请求数据的,在jsp中这个sessionid的名字叫做JSESSIONID。下面贴下代码:
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CookieStore;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
public class MyHttpClient {
private DefaultHttpClient httpClient;
private HttpPost httpPost;
private HttpEntity httpEntity;
private HttpResponse httpResponse;
public static String JSPSESSID = null;
public String executeRequest(String path, List<NameValuePair> params) {
String ret = "none";
try {
this.httpPost = new HttpPost(path);
httpEntity = new UrlEncodedFormEntity(params, HTTP.UTF_8);
httpPost.setEntity(httpEntity);
//第一次一般是还未被赋值,若有值则将SessionId发给服务器
if(null != JSPSESSID){
httpPost.setHeader("Cookie", "JSPSESSID=" + JSPSESSID);
}
httpClient = new DefaultHttpClient();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
try {
httpResponse = httpClient.execute(httpPost);
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
HttpEntity entity = httpResponse.getEntity();
ret = EntityUtils.toString(entity);
CookieStore mCookieStore = httpClient.getCookieStore();
List<Cookie> cookies = mCookieStore.getCookies();
for (int i = 0; i < cookies.size(); i++) {
//这里是读取Cookie['JSPSESSID']的值存在静态变量中,保证每次都是同一个值
if ("JSPSESSID".equals(cookies.get(i).getName())) {
JSPSESSID = cookies.get(i).getValue();
break;
}
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return ret;
}
}
其实web的原理都是一样的,基于http协议的,那么如果网站不是jsp做的话,那个叫做Sessionid的Cookie可能叫做别的了,不叫JSPSESSID,如PHP是PHPSESSID,这个可能要具体情况去查了。
其实不只是Android程序,其他任何程序需要这么用的时候只需要在http协议请求header里头加上发送相应的SessionId就可以了。刚刚这种方法是可以帮助理解sessionid的,其实还有一种方法如果更通用的话,就可以将刚刚所有的Cookie每次都发回到服务器端,也就可以解决session保持的问题了,只是这样可能会稍微大些网络流量开销而已。
分享到:
相关推荐
在Android开发中,获取Web服务器端的Session并进行登录验证是一项常见的任务,特别是在构建混合式应用或者需要与Web服务紧密交互的应用中。本篇将详细阐述这个过程中的关键知识点。 一、理解Session Session是Web...
在Android开发中,当使用HttpURLConnection与Web服务器进行通信时,常常遇到的一个问题是无法正确保持session,导致每次请求都被服务器视为新的独立会话。这主要由于HTTP协议本身的无状态特性,以及Android客户端与...
通常,每个请求头都需要携带这个Session ID,表明用户已登录。例如: ```java // 在后续请求中添加Session ID Request request = new Request.Builder() .url("http://yourserver.com/protected_resource.php") ....
1. 创建一个Android项目,例如名为`GetWebSession`,并定义三个Activity:`GetWebSession.java`, `LoginSuccessActivity.java`, 和 `GetUserInfoActivity.java`。 `GetWebSession.java`是入口点,负责展示登录...
"android获取web服务器端session并验证登陆实用.pdf"这篇文档探讨的就是如何在Android应用中实现这一功能,尤其是在处理服务器端的session保持方面。以下是相关知识点的详细说明: 1. **Web服务器端的Session**: ...
其实sesion在浏览器和web服务器直接是通过一个叫做name为sessionid的cookie来传递的,所以只要在每次数据请求时保持sessionid是同一个不变就可以用到web的session了,做法是第一次数据请求时就获取sessionid的值并...
在Android和ASP.NET之间共享Session主要是为了保持用户的状态,使得用户在移动应用和Web服务之间的交互更为顺畅。Session是Web应用程序中用于存储用户特定信息的一种机制,通常在服务器端保存。在ASP.NET中,Session...
在Android电子拍卖系统项目中,开发者需要掌握一系列关键技术和概念,以便构建一个功能完善的拍卖平台。这个项目特别强调了WEB端、用户登录处理、以及数据交换格式JSON的使用。以下是对这些知识点的详细阐述: 1. *...
webView = findViewById(R.id.web_view); webView.getSettings().setJavaScriptEnabled(true); // 启用JavaScript webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished...
当用户登录成功后,服务器通常会返回一个包含 `SessionId` 的 Cookie,该 `SessionId` 需要在后续的所有请求中携带。 示例代码如下: ```java DefaultHttpClient httpClient = new DefaultHttpClient(); ...
本资源包含一个完整的Android应用源码,展示了如何通过Android客户端与Web服务器进行交互,实现一个基本的登录功能。这个功能的实现涵盖了服务端、数据库以及Android客户端三个主要部分。下面将详细阐述这些部分的...
在Android开发中,实现一个登录功能通常涉及到与Web服务器的交互,这通常通过发送HTTP请求并解析返回的数据来完成。本示例中的"利用JSON,通过Android客户端访问web服务器,实现一个登录功能"是一个典型的客户端-...
1. 客户端(Android)首先需要建立一个项目(例如GetWebSession),并在项目中编写至少三个Activity类(GetWebSession.java, LoginSuccessActivity.java, GetUserInfoActivity.java)。 2. 第一个Activity...
Cookie最初被设计为Web浏览器的一种功能,但随着时间的推移,它也被广泛应用于移动应用,特别是在Android平台上。本文将深入探讨Android中的Cookie,包括其原理、用途、管理以及在实际开发中的应用。 一、Cookie...
当用户访问网站并进行某些操作(如点击登录)时,服务器会在内存中创建一个与该用户相关的session对象,并为其分配一个唯一的ID(session ID)。这个ID随后通过cookie或者URL重写的方式返回给客户端。之后,客户端在...
10. **状态维护**:在某些场景下,如登录状态,客户端可能需要保存服务器返回的Session ID或Token,以便后续请求携带这些信息,维持用户会话。 综上所述,Android客户端与服务器的数据交互是一个涉及网络连接、请求...
在Web浏览器中,当用户访问一个网站并登录时,服务器会返回一个包含session ID的cookie,浏览器将其保存并自动在后续请求中发送回服务器,以此来保持用户的登录状态。 在Android的WebView中,虽然默认情况下会处理...
- Session机制:服务器创建一个Session ID并返回给客户端,客户端在后续请求中附带该ID,服务器根据ID识别用户。 - Token机制:例如JWT(JSON Web Tokens),包含用户信息的加密字符串,客户端存储并发送给服务器...
8. **状态管理**:为了跟踪用户的登录状态和个性化信息,Android客户端可能需要保存服务器返回的Token或Session ID,并在后续请求中携带,以维持会话状态。 9. **错误处理**:网络请求可能会遇到各种问题,如网络...