大家在电脑上登录网上购物商城的时候购物,先进行登录,输入用户名密码,然后看到自己中意的商品就点开它的详情页面查看详细参数,然后决定买不买,在打开详情页面的时候,页面已经实现了跳转,那么第二个页面是服务器怎么知道你就是之前登录的的那个人呢??这里用到了session会话,在登录的时候输入用户名密码,服务器会返回一个session值,登录成功以后访问其他页面,浏览器会自动带着之前服务器分配给你的session值去访问服务器的其他接口,这样,其他接口看到了你拿的这个session值,就知道此时的你就是之前登录的那个人了,下面以谷歌浏览器为例,来看看浏览器是怎么折腾这个session值的。
我先访问登录接口,截图如下:

我将用户名密码作为参数携带,访问登陆接口,登陆成功,右侧一栏捕捉到的信息如图所示,在“headers”标签下,在“Response Headers”中,可以看到键为“Set-Cookie”,值为”JSESSIONID=XXXXXXXXXXXX”的键值对,当然,后面的那个“Path=/”暂时忽略,这里的意思就是你登录成功啦,服务器返回的响应头里面存储了SESSION的信息,而这个信息就在”Set-Cookie”中,紧接着我们访问获取个人信息的接口,如图所示:

我并没有携带任何参数去访问获取个人信息接口,但是服务器就是很准确的把我之前登录过的账号的信息返回了回来,可以看到屏幕左边有一串JSON数据,然后再看右边的“headers”标签下,在“Request Headers”标签下,即请求头标签下,我们可以看到以“Cookie”为键,“JSESSIONID=XXXXXXXX”为值的键值对,而且“JSESSIONID”后面的数值和第一次登陆的时候服务器返回的JSESSIONID的值一样,这说明了,谷歌浏览器自动的保存了服务器返回给我们的“Set-Cookie”的值,并且在以后的访问接口的过程中,把值加到了“Cookie”这个键上面,Android客户端也是一样,第一次登录的时候获取“Set-Cookie”的值,把这个值保存在本地,在以后的访问接口过程中把存在本地的值取出来,然后加到请求头上面就可以了。下面看代码:
MainActivity代码:

public class MainActivity extends Activity {//登录的接口,顺便把用户名密码带上去,直接访问接口即可public static final String login_url="http://192.168.1.110:8090/ehetu_common/login.action?userName=18215199999&password=123456";//获取个人信息的接口public static final String getUserInfo_url="http://192.168.1.110:8090/ehetu_common/getUserInfo.action";private TextView tv_response,tv_jsessionid;private SharedPreferences preference;private SharedPreferences.Editor editor;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv_response=(TextView) findViewById(R.id.tv_response);tv_jsessionid=(TextView) findViewById(R.id.tv_jsessionid);preference=getSharedPreferences("cookie", MODE_PRIVATE);editor=preference.edit();}//访问登录接口public void login(View v){new Thread(){public void run() {try {URL url=new URL(login_url);HttpURLConnection con=(HttpURLConnection) url.openConnection();con.setRequestMethod("GET");InputStream is=con.getInputStream();//注意这里获取服务器返回的头部信息,获取JSESSIONID=XXXXXX的信息final String cookieString=con.getHeaderField("Set-Cookie");//然后保存在本地editor.putString("jsessionid", cookieString);editor.commit();ByteArrayOutputStream bos=new ByteArrayOutputStream();byte[]buffer=new byte[1024];int len=0;while((len=is.read(buffer))>0){bos.write(buffer,0,len);}bos.flush();is.close();byte []result=bos.toByteArray();final String res=new String(result);runOnUiThread(new Runnable() {public void run() {tv_response.setText(res);tv_jsessionid.setText(cookieString);}});     } catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}};}.start();}//访问获取个人信息的接口public void getUserInfo(View v){new Thread(){public void run() {try {URL url=new URL(getUserInfo_url);HttpURLConnection con=(HttpURLConnection) url.openConnection();con.setRequestMethod("GET");//注意,把存在本地的cookie值加在请求头上con.addRequestProperty("Cookie", preference.getString("jsessionid", ""));InputStream is=con.getInputStream();ByteArrayOutputStream bos=new ByteArrayOutputStream();byte[]buffer=new byte[1024];int len=0;while((len=is.read(buffer))>0){bos.write(buffer,0,len);}bos.flush();is.close();byte []result=bos.toByteArray();final String res=new String(result);runOnUiThread(new Runnable() {public void run() {tv_response.setText(res);}});     } catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}};}.start();}}

activity_main.xml代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="15dip" ><Button
        android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="login"android:text="访问登录接口,获取信息" /><Button
        android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="getUserInfo"android:text="访问获取个人信息的接口" /><TextView
        android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dip"android:text="服务器返回的信息:"android:textColor="#000"android:textSize="17sp" /><TextView
        android:id="@+id/tv_response"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dip"android:textSize="15sp" /><TextView
        android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dip"android:text="服务器返回的JSESSIONID的信息:"android:textColor="#000"android:textSize="17sp" /><TextView
        android:id="@+id/tv_jsessionid"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dip"android:textSize="15sp" /></LinearLayout>

这是运行程序效果图:

可以看到,主界面主要是两个按钮,一个按钮触发用户登录事件,并且把服务器端返回头里面”Set-Cookie”这个键对应的值利用SharedPreferences保存在本地,在点击第二个按钮获取个人信息的时候,再从本地取出来,加到请求头上面。这是点击登录按钮之后的截图:
这是点击获取个人信息之后的截图:

可以看到,服务器把个人信息都返回回来了。

Android客户端访问服务器保持SESSION会话的实现相关推荐

  1. Android客户端与服务器端交互,如何保持session回话

    前言 最近在开发项目的过程中,遇到Android与web服务器要在同一session下通信的问题. 一.Session与Cookie的共性与区别: ①.共性 Cookie和Session都为了用来保存 ...

  2. android客户端与服务器端交互 如何保持session

    最近在开发项目的过程中,遇到android与web服务器要在同一session下通信的问题. 在解决问题前先回顾下Session与Cookie: Cookie和Session都为了用来保存状态信息,都 ...

  3. android 访问服务器josn文件,Android客户端对服务器回来的json文件进行解析

    Android客户端对服务器返回的json文件进行解析 和解析XML的方式大同小异,只有解析方式存在区别: /** * 解析服务器返回来的json数据 * @param content * @retu ...

  4. 状态管理之cookie使用及其限制、session会话

    # 1.什么是状态管理? 将浏览器与web服务器之间多次交互当作一个整体来处理,并且将多次交互所涉及的数据(即状态)保存下来. (cookie浏览器所涉及到的访问数据保存下来) # 2.如何进行状态管 ...

  5. 谈谈Session会话和Cookie

    Session Session在我们的网络应用中就是一种客户端与服务器端保持状态的解决方案 Session对象,就是客户端浏览器与服务器之间建立的互动信息状态.每一个不同的用户连接将得到不同的Sess ...

  6. 负载均衡之session会话保持

    session会话保持原理 1. 什么是会话保持? 会话保持是负载均衡最常见的问题之一,也是一个相对比较复杂的问题.会话保持有时候又叫做粘滞会话(Sticky Sessions).会话保持是指在负载均 ...

  7. 跨域请求,关于后端session会话丢失的解决办法

    目前使用前后端分离的模式开发,后端提供跨域接口.前端jsonp调用,绑定数据,但是在该站点下有个人中心模块存在的情况下,服务端的session会话会被跨域请求覆盖改掉 大家都知道tomcat使用coo ...

  8. redis介绍及保持session会话

    转载自:http://blog.51cto.com/cherryliang/1944361 Redis介绍 ●redis是一个key-value存储系统.和Memcached类似,它支持存储的valu ...

  9. PHP漏洞之session会话劫持

    本文主要介绍针对PHP网站Session劫持.session劫持是一种比较复杂的攻击方法.大部分互联网上的电脑多存在被攻击的危险.这是一种劫持tcp协议的方法,所以几乎所有的局域网,都存在被劫持可能. ...

最新文章

  1. log4cplus使用(二)-自定义日志等级
  2. 分享用mockplus原型图工具制作的
  3. C++中char类型的溢出问题
  4. layui如何获取父节点的父节点_jquery获取父元素或父节点的方法
  5. python3数据类型:Tuple(元组)
  6. PHP垃圾回收深入理解
  7. STM32上使用JSON
  8. java自定义tag,tag文件与tag标记,java自定义标签
  9. JAVA中實現鏈表 LinkedList的使用
  10. Java-ArrayList.Itr类(Iterator的实现)
  11. Excel 对比两列数据大小 大于等于 高亮显示
  12. Pooling反向传播
  13. 面试时被问有没有别家offer,回答没有,面试总是挂!回答有,就说我是面试选手,欺骗公司!...
  14. SpringMVC复习——B站
  15. npm-deprecate
  16. 大班线描机器人_大班线描画-有趣的巨人
  17. ESP32数据存储 nvs
  18. 数据结构与算法——23. 用嵌套列表与链表实现树结构
  19. SDS(Spoken Dialogue System) 对话系统
  20. 用Java实现的eChat聊天服务器

热门文章

  1. XV6 RISCV源码阅读报告之中断
  2. 人工智能语言,我们的骄傲
  3. php如何平铺背景图片,css如何让背景图片平铺?css背景图片平铺四种方式介绍
  4. 国际会议及期刊星级说明
  5. 【手绘漫画】图解LeetCode之相交链表(LeetCode 160)
  6. 秋天来了,穿衣搭配。简单几件穿出独特气质
  7. 什么是单反相机,和普通相机有什么区别
  8. Java除法结果带小数、进一法的实现
  9. go实现时针分针夹角问题
  10. 【hadoop】MultipleOutputFormat和MultipleOutputs