android实现session保持简要概述及实现
其实sesion在浏览器和web服务器直接是通过一个叫做name为sessionid的cookie来传递的,所以只要在每次数据请求时保持sessionid是同一个不变就可以用到web的session了,
感兴趣的你可以参考下本文或许对你有所帮助在最近写的一个Android中需要请求web服务器中的数据,有一个登录Activity,登录后会到MainActivity,这中间登录和 MainActivity都需要请求php的jsonapi,所以要在网络请求中保持session的,研究了好半天才搞定。
其实sesion在浏览器和 web服务器直接是通过一个叫做name为sessionid的cookie来传递的,所以只要在每次数据请求时保持sessionid是同一个不变就可 以用到web的session了,做法是第一次数据请求时就获取sessionid的值并保存在一个静态变量中,然后在第二次请求数据的时候要将这个 sessionid一并放在Cookie中发给服务器,服务器则是通过这个sessionid来识别究竟是那个客户端在请求数据的,在jsp中这个 sessionid的名字叫做JSESSIONID。下面贴下代码
package my.android; 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.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 JSESSIONID = null; public MyHttpClient() { } 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 != JSESSIONID) { httpPost.setHeader("Cookie", "JSESSIONID=" + JSESSIONID); } httpClient = new DefaultHttpClient(); } catch (Exception 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['JSESSIONID']的值存在静态变量中,保证每次都是同一个值 if ("JSESSIONID".equalsIgnoreCase(cookies.get(i).getName())) { JSESSIONID = cookies.get(i).getValue(); break; } } } } catch (Exception e) { e.printStackTrace(); } return ret; } } // 注意,使用摸拟器访问本地,ip使用10.0.2.2 // Value 是实现了 NameValuePair接口的简单类 public class helloandroidactivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new Thread(){ public void run(){ MyHttpClient client = new MyHttpClient(); List<NameValuePair> list = new ArrayList<NameValuePair>(); list.add(new Value("id","2")); client.executeRequest("http://10.0.2.2:8080/DetronVOIP/account/find", list); } }.start(); } }
其 实不只是Android程序,其他任何程序需要这么用的时候只需要在http协议请求header里头加上发送相应的SessionId就可以了。刚刚这 种方法是可以帮助理解sessionid的,其实还有一种方法如果更通用的话,就可以将刚刚所有的Cookie每次都发回到服务器端,也就可以解决 session保持的问题了,只是这样可能会稍微大些网络流量开销而已。
这里看到一个SessionId的本质,顺便mark一下。
SessionID的本质
一、客户端用cookie保存了sessionID
客 户端用cookie保存了sessionID,当我们请求服务器的时候,会把这个sessionID一起发给服务器,服务器会到内存中搜索对应的 sessionID,如果找到了对应的 sessionID,说明我们处于登录状态,有相应的权限;如果没有找到对应的sessionID,这说明:要么是我们把浏览器关掉了(后面会说明为什 么),要么session超时了(没有请求服务器超过20分钟),session被服务器清除了,则服务器会给你分配一个新的sessionID。你得重 新登录并把这个新的sessionID保存在cookie中。
在没有把浏览器关掉的时候(这个时候假如已经把sessionID保存 在cookie中了)这个sessionID会一直保存在浏览器中,每次请求的时候都会把这个sessionID提交到服务器,所以服务器认为我们是登录 的;当然,如果太长时间没有请求服务器,服务器会认为我们已经所以把浏览器关掉了,这个时候服务器会把该sessionID从内存中清除掉,这个时候如果 我们再去请求服务器,sessionID已经不存在了,所以服务器并没有在内存中找到对应的 sessionID,所以会再产生一个新的sessionID,这个时候一般我们又要再登录一次。
二、客户端没有用cookie保存sessionID
这 个时候如果我们请求服务器,因为没有提交sessionID上来,服务器会认为你是一个全新的请求,服务器会给你分配一个新的sessionID,这就是 为什么我们每次打开一个新的浏览器的时候(无论之前我们有没有登录过)都会产生一个新的sessionID(或者是会让我们重新登录)。
当 我们一旦把浏览器关掉后,再打开浏览器再请求该页面,它会让我们登录,这是为什么?我们明明已经登录了,而且还没有超时,sessionID肯定还在服 务器上的,为什么现在我们又要再一次登录呢?这是因为我们关掉浏览再请求的时候,我们提交的信息没有把刚才的sessionID一起提交到服务器,所以服 务器不知道我们是同一个人,所以这时服务器又为我们分配一个新的sessionID,打个比方:浏览器就好像一个要去银行开户的人,而服务器就好比银行, 这个要去银行开户的人这个时候显然没有帐号(sessionID),所以到银行后,银行工作人员问有没有帐号,他说没有,这个时候银行就会为他开通一个帐 号。所以可以这么说,每次打开一个新的浏览器去请求的一个页面的时候,服务器都会认为,这是一个新的请求,他为你分配一个新的sessionID。
相关推荐
SSM+Redis 实现Session共享是现代Web应用中常见的技术组合,主要目的是在分布式系统中保持用户Session的一致性。SSM是指Spring、Spring MVC和MyBatis这三大Java Web开发框架的组合,而Redis则是一种高性能的键值存储...
要实现session粘滞(Session Stickiness),即同一用户的请求始终被转发到同一台服务器,Nginx可以通过cookie或者session ID来实现。比如,当用户首次访问时,Nginx可以设置一个带有特定标识的cookie,后续请求中,...
"Spring Boot + Shiro + Redis 实现 Session 共享方案二" 1. 概述 本文档旨在介绍如何使用 Spring Boot、Shiro 和 Redis 实现分布式 session 共享,以解决 Web 应用程序的登录 session 统一问题。 2. 相关依赖 ...
在Android开发中,获取Web服务器端的Session并进行登录验证是一项常见的任务,特别是在构建混合式应用或者需要与Web服务紧密交互的应用中。本篇将详细阐述这个过程中的关键知识点。 一、理解Session Session是Web...
Spring Session 是一个开源项目,由 Pivotal Software 开发,旨在提供一种在分布式环境中实现Session共享的解决方案。在传统的Web应用中,Session信息通常存储在单个服务器的内存中,当应用部署在集群或者分布式环境...
当多个服务器共同处理用户请求时,保持用户会话(session)的一致性是必要的,以确保用户在不同服务器之间切换时不会丢失登录状态或其他关键信息。本主题将深入探讨如何使用Tomcat和Redis来实现这一目标。 首先,让...
后续的请求会根据session ID查找对应的session数据,无论请求路由到哪台服务器,都能获取到正确的session信息,实现了session的跨服务器共享。 五、优点与挑战 使用Redis进行session共享有以下优势: 1. 可靠性高...
Android中使用session传送对象,集合数据,在Activity中Session session=Session.getSession();得到session对象,session的类,本人已经上传
本篇文章将深入探讨如何在Android应用中集成SSH客户端,实现登录并保持SESSION来访问服务端数据。 首先,我们要了解SSH框架的选择。在Android中,我们可以使用JSch库,这是一个Java实现的SSH2库,可以实现SFTP、SCP...
在Android平台上实现SSH(Secure Shell)功能,可以让用户通过安全的网络协议远程访问和控制设备。SSH是一种网络协议,主要用于安全地执行命令行操作、传输文件等,它使用加密技术确保数据传输的安全性。以下是对...
在现代Web应用中,Session管理是至关重要的,它允许服务器保持与客户端的会话状态。然而,当应用部署在多台服务器上时,单个服务器的Session无法在其他服务器之间共享,导致用户在不同服务器之间切换时需要重新登录...
每当客户端请求服务器时,都会将这个session ID一并发送回去,这样服务器就能识别出请求来自哪个用户,从而实现状态保持。 在"loginDemo"这个示例中,我们可能看到以下几个关键步骤: 1. **用户登录**:用户输入...
**二、Tomcat-Redis-Session-Manager概述** Tomcat-Redis-Session-Manager是基于Apache Tomcat的Session管理器,通过集成Redis作为Session持久化存储,实现了跨服务器的Session共享。它将Tomcat中的Session数据序列...
Springboot实现多服务器session共享 Springboot实现多服务器session共享是指在分布式系统中,每个服务器上的Session可以共享,实现 Session 的同步和共享,从而解决了在分布式环境中Session不一致的问题。下面是...
### Spring-Session与Redis结合实现Session共享 在分布式系统中,单点登录(Single Sign-On,简称SSO)成为一种常见的需求。为了实现这一目标,就需要解决不同服务器间Session共享的问题。Spring-Session正是为此而...
在Android开发中,当使用HttpURLConnection与Web服务器进行通信时,常常遇到的一个问题是无法正确保持session,导致每次请求都被服务器视为新的独立会话。这主要由于HTTP协议本身的无状态特性,以及Android客户端与...
在单个服务器上,Session可以通过内存来管理,但在分布式环境下,多个服务器无法共享同一个内存中的Session,这就需要引入外部存储来实现Session共享。 Redis是一个高性能的键值数据库,常被用作缓存和会话存储解决...
如果没有sessionId就新创建session,如果有sessionId,就去redis中查看是否有此id的记录,如果没有就新建session,如果有,还是新建session,并把redis中此session的相关数据赋值给新建的session,最后保存sessionId...