请教一个关于Android登陆保持的问题

wang_liran 发布于 2013/08/04 09:51
阅读 14K+
收藏 3
先声明,我是安卓开发菜鸟。

在网上搜索过相关登陆保持的代码,原理大致是从本地cookie上获取JSESSIONID(假设后台由java搭建),然后通过httpClient.setHeader()这个方法将JSESSIONID发送给服务器,服务器确认该session还存在后就算是保持登陆成功。

我自己的想法是:

当用户登陆成功后,服务器会将userid设置在服务器端的session里边,然后通过登陆保持app可以将该id取出来作为之后的服务器请求参数来使用,如果不是这样那么登陆保持将没有任何意义;

问题是:

android客户端如何将服务器中session值取出?


以上是我个人想法和问题,如有愚笨,请各位海涵!谢谢。。
加载中
0
专业打酱油
专业打酱油

引用来自“wang_liran”的答案

引用来自“专业打酱油”的答案

1、登录或其他认证操作,android->server, server中有某种算法,返回唯一的sessionid,android保存此sessionid(比如sqlite),server也需要保存此sessionid(比如放到Map...so on)。

2、android其他需要验证用户身份信息的操作,android->server,传递sessionid,

server验证下是否有sessionid,如果有,就go on,如果没有,需要身份验证。

3、android不需要获取server的session信息,仅需记住步骤1返回的sessionid就可以。

那请问例如我登录验证完后用户id这个参数,我作为安卓端是以怎样的获取方式获取最好?因为你说不需要获取session的信息,貌似就只能是直接返回一个id值存入sharepreference了,这样处理会不会不安全?
1、获取session一般是登录的时候,通过server返回给android一个sessionid。你保存这个sessionid就可以了!
2、需要验证用户身份的时候,把这个sessionid当做一个参数,传给server,由server来验证此sessionid是否存在合法。(
比如用户要查看自己的资料,当然要用户首先登录,才可以!但是你不想让用户反复登录,所以需要验证用户是否已经登录了:
比如你的参数为一个userid,这时,因为你要验证用户信息,所以你的参数需要增加一个sessionid,也就是说:android post/get userid,sessionid给server,server首先验证sessionid,然后执行其他操作!)
3、关于sessionid保存到什么地方,只要是app层面唯一就可以!
4、安全性问题,我建议你先能走通整个验证流程在考虑。
(你还不会走,就考虑走、跑、会不会出现摔倒的情况,有点早- -)
gongweixin
gongweixin
这样做的话如何保证sessionId不被劫持呢?
0
叶大侠
叶大侠

Android端输入凭证-》服务端验证符合,设置session存到服务端,返回session的信息(可以放到set-cookie的头部中,也可以放到数据段中)-》Android端保存该session信息.

以后Android的各种请求都带上该session和服务器端的匹对.

0
wang_liran
wang_liran

引用来自“DarcyYe”的答案

Android端输入凭证-》服务端验证符合,设置session存到服务端,返回session的信息(可以放到set-cookie的头部中,也可以放到数据段中)-》Android端保存该session信息.

以后Android的各种请求都带上该session和服务器端的匹对.

请问你所说的返回的session 信息是指session id还是服务器在session中存放的值?另外该如何获取服务器端中的session信息?具体方法是什么?谢谢
0
kenping
kenping
跟Android没有一毛钱关系,去看看HTTP协议吧
0
wang_liran
wang_liran

引用来自“kenping”的答案

跟Android没有一毛钱关系,去看看HTTP协议吧
感谢你的回答,其实安卓登陆保持的原理就是保持session对吧,可是我就只是不清楚如何从session取值,如果不能取值否则保持登陆无意义,我查过httpclient的api,没有找到有关session的取值方法,我是新手,查阅过资料,没人明确跟我说下的话我认识起来不清晰,所以劳烦你解答,谢谢   
0
liuleidefeng
liuleidefeng
看了你的问题和你和其他人的交流,感觉你的相关知识需要大补,的确是像上面的人说的,这跟android没有半毛关系。主要问题出现在你没有真正的搞清楚session,cookie,http协议。先把这几个概念搞清楚了,这个问题也就解决了。(尤其是要仔细看看session的定义!)
0
叶大侠
叶大侠

去研究一下Http协议的内容,以及java是哪些api和它们对应上的。很多工具可以帮上忙的,例如火狐的httpfox,用它来分析浏览器上的登录和在线是怎么完成的,那么android上的原理也是一样的啦。

至于具体的代码,这是javase api中的,httpclient只是进一步简化了使用,找个例子看看就会拉。

URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod(“HEAD”);
connection.connect();
String cookie = connection.getHeaderField(“Set-Cookie”);

 

0
专业打酱油
专业打酱油

1、登录或其他认证操作,android->server, server中有某种算法,返回唯一的sessionid,android保存此sessionid(比如sqlite),server也需要保存此sessionid(比如放到Map...so on)。

2、android其他需要验证用户身份信息的操作,android->server,传递sessionid,

server验证下是否有sessionid,如果有,就go on,如果没有,需要身份验证。

3、android不需要获取server的session信息,仅需记住步骤1返回的sessionid就可以。

0
wang_liran
wang_liran

引用来自“liuleidefeng”的答案

看了你的问题和你和其他人的交流,感觉你的相关知识需要大补,的确是像上面的人说的,这跟android没有半毛关系。主要问题出现在你没有真正的搞清楚session,cookie,http协议。先把这几个概念搞清楚了,这个问题也就解决了。(尤其是要仔细看看session的定义!)
谢谢指教,我的确不熟悉这方面知识,这块知识已经在看了,可是总感觉多少都有些模糊
0
kenping
kenping

了解了HTTP协议后,你需要关心的就是如何获取cookie和设置cookie,

如果是Apache的HttpClient的话有相关API,自动完成

如果是HttpURLConnection的话,则要看版本,新的版本里面已经有相关Cookie处理的类,例如CookieManager/HttpCookie(你可以去看其相关代码用于旧版本),如果想要兼容旧版本就需要自己去处理cookie,从HttpURLConnection的头里面得到cookie(key=conn.getHeaderFieldKey()/conn.getHeaderField()/key.equalsIgnoreCase("Set-Cookie")),响应的时候再发回去(conn.setRequestProperty("Cookie", cookie);)

// 获取cookie,cookies是Map<String,String>
for (int i = 1;; i++)
{
    String key = conn.getHeaderFieldKey(i);
    String value = conn.getHeaderField(i);
    if (null == key)
    {
        break;
    }
    if (enableCookie && key.equalsIgnoreCase("Set-Cookie"))
    {
        String cookie = value.substring(0, value.indexOf(";"));
        int pos = cookie.indexOf('=');
        if (pos > 0)
        {
            cookies.put(cookie.substring(0, pos), cookie.substring(pos + 1));
        }
        else
        {
            cookies.put(cookie, "");
        }
    }
}

// 设置cookie
StringBuilder sb = new StringBuilder();
synchronized (cookies)
{
    Iterator<Map.Entry<String, String>> it = cookies.entrySet().iterator();
    while (it.hasNext())
    {
        Map.Entry<String, String> entry = it.next();
        sb.append(entry.getKey());
        if (entry.getValue().length() > 0)
        {
            sb.append("=").append(entry.getValue());
        }
        sb.append("; ");
    }
}
String cookie = sb.toString().trim();
if (cookie.length() > 0)
{
    conn.setRequestProperty("Cookie", cookie);
}

返回顶部
顶部