关于token在服务器端处理

艾德 2015-02-05 11:14:01
大家好,
以前做网页后台,浏览器都有cookie,每次请求会带回sessionid,这样应用服务器就找出对应的session。业务逻辑里只要看session里有没有用户信息就可以了。

最近在做app的后端,ios上似乎没有cookie/sessionid的概念,导致登录后服务器无法记住登录状态。网上查了一通,说要使用token。简单说就是在第一次使用用户名密码登录后,服务器返回一个token, 之后ios的接口请求都带上token。

那么问题来了,

后端要怎么处理token呢?目前我的做法是在拦截器里处理,一旦发现请求里带了token, 就去数据库查token是否有效,有效再把用户信息放在当前session里,供业务逻辑处理。
这样有两个问题:
1. 每次请求都要去查下token ,查到token有效再调出用户信息放进session里. 效率不高
2. 没法往session里加入其它用户相关信息。

想请教下大家,app的服务器端一般怎么处理token的?
...全文
35358 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
艾德 2017-06-30
  • 打赏
  • 举报
回复
引用 16 楼 m0_38004838 的回复:
楼主,你最后是怎么解决的token存储,我最近也在做这方面的,请教下!
见楼上得分的回复, 和楼上介绍的差不多,把token和用户对象存在redis里。这应该也是最常见的做法。
过眼云烟成 2017-06-30
  • 打赏
  • 举报
回复
楼主,你最后是怎么解决的token存储,我最近也在做这方面的,请教下!
llihua 2016-07-21
  • 打赏
  • 举报
回复
其实就是用session和不用session的两种方式。怎么做都要写代码。 1、仍借用session(假设不支持cookie),需要重写服务器端代码,把“判断header中有没有sessionid,有则从map中取出之前的session,没有则新建session”,改为“判断url中有没有带token,有token则从缓存中取出之前的session,没有token则新建session”。 或者重写客户端逻辑,读取header里的Set-Cookie:JSESSIONID=XXXXXX,缓存此sessionid到内存中,后续请求时往header里放入Cookie: JSESSIONID=XXXXXX。 2、不用系统session,用token来缓存用户登录信息。登录时,服务器端生成token,按token缓存用户登录信息(例如使用redis),并设置超时时间。客户端后续请求时,校验token,从缓存中取出用户登录信息,更新token超时时间。
chendejia2012 2016-05-29
  • 打赏
  • 举报
回复 1
其实token就相当于sessionId,为什么app喜欢用token,而不用sessionId呢?app说他们保管cookie不方便,不好维护cookie,因为cookie是浏览器的东西,app天生不支持cookie。我觉得很奇怪,浏览器也会出现关闭cookie的时候,这时,服务器会重写url,将sessionId放到url后面,如果app不打算用cookie,那么与浏览器关闭cookie无异,服务器将sessionId放到url后,app完全可以把sessionId拿出来,缓存到app数据库或者内存中,下次访问服务器就带上sessionId。服务器默认的sessionId名称叫JSESSIONID,app说他们需要token,那么就把JSESSIONID换一个名称,就叫token,那么服务器和重写url返回sessionId一样,就把token放到url后面就可以了。实际token和JSESSIONID的值是一样的,换汤不换药,然后APP开发会觉得很高兴,他们终于拿到想要的token了。然而对api开发来说,感觉这其实多此一举。 token是怎么来的呢?实际如果app后面对应的服务器如果是分布式系统,就需要token了,因为app需要到登录服务器上登录,然后到应用服务器去获取数据,这里涉及到不同的服务器,那么不同服务器对应到该app客户端的sessionId肯定不一样,app不像浏览器那么强大,管理不同域下的sessionId都很方便,这时app肯定希望有一个统一的sessionId,那就是token,方便访问不同的服务器。还有一个理由是,应用服务器需要校验当前app是否登录,于是要到登录服务器上去询问,询问时总要带个app的凭证吧,于是需要一个token,这个token是登录服务器给app的,应用服务器拿着这个token去询问登录服务器,登录服务器校验该token后,就会告知应用服务器当前app是否合法(在我这里登录过),然后应用服务器才能放心的把数据返回给app。 大家可以参考单点登录服务器与应用服务器,与客户端的交互,便可知道token的用法了。 实际如果应用服务器同时带登录功能,那么完全可以不必搞个token出来,就沿用sessionId就可以了。如果app非要token,那么可以修改server.xml,把默认JSESSIONID改成token。 经常会看到第三方服务接口,如新浪微博,都需要带上一个access_token,实际新浪微博就相当于一个第三方登录系统,而且心流浪微博后面会有多个分布式系统,系统与系统之间交互肯定需要token,那么新浪微博就会要求客户端带上access_token,而这个access_token是可以通过新浪微博接口获取的,每获取一次,access_token会改变,看来这个access_token就像一个sessionId,可以重置。 有时候我真的觉得和一些app开发争论token和sessionId谁优谁劣没有意思,具体问题具体分析,该用什么就用什么。就好像争论java好还是c好,还是PHP好一样,有意思么?不同的东西有不同的业务场景。
Kanepan 2016-04-20
  • 打赏
  • 举报
回复
一般都是放入 分布式缓存中 比如 memcached token可以从 http Head中带过来, 也可以参数带过来。 建议从Head中带过来。 1. 每次请求都要去查下token ,查到token有效再调出用户信息放进session里. 效率不高 基本都这么做的。 一次memcached的读请求,能有什么开销。 你要说效率,可以多部署几个WEB应用。 2. 没法往session里加入其它用户相关信息。 直接把 LoginUserInfo 对象信息放入memcached中 代码片段:

public class LoginUser implements Serializable {
	private static final long serialVersionUID = 1L;

	private UserInfo userInfo;

	private Map<String, Object> attributes = new HashMap<String, Object>();

	private String sessionId;

	private String remoteIp;

	private String operUrls;

	private Set<String> operSet;
qq_22934435 2016-04-19
  • 打赏
  • 举报
回复
按时打算亲爱速度
艾德 2015-02-10
  • 打赏
  • 举报
回复
引用 5 楼 qq467339640 的回复:
最近我也在做关于app方面的token登陆,我这边是把token放入到数据库中,定时清除过期token,之后再做了一层缓存,只要验证通过了就缓存一下,要查询其他信息可以通过token查询呀,做了缓存效率不会低的,据说大型网站都不适用session,效率也没低到哪里去
我计划也这么做,这相当于自己管理了sessionid -> session的缓存和过期处理。 求更简单的办法
艾德 2015-02-10
  • 打赏
  • 举报
回复
引用 4 楼 skgary 的回复:
[quote=引用 3 楼 liuade 的回复:] [quote=引用 2 楼 buliar 的回复:] 放到memcache即可. 1-若干天过期, 无需过多关注,没了重新登录就是
非常感谢,把token缓存起来,按过期时间处理是一种可行的方式。但得写代码不是。最理想的还是让应用服务器把token当sessionid一样,弄一个基于token的session。不知道这样是不是可行。[/quote] 你在客户端里的http client里加上cookie的逻辑就是了。 在response里看有没有setCookie的头,如果有的话,就需要在后续的请求里把Cookie 的header再带上去。[/quote] IOS的开发说那边没有http client似乎的东西。不熟悉ios,不知道他说得对不对。不过我看很多app似乎都是用token的。
skgary 2015-02-10
  • 打赏
  • 举报
回复
引用 9 楼 crazypandariy 的回复:
token一般不要直接放在数据库里。 自己实现一个简单的类似session管理的程序: 1、定义一个数据结构Session,用来描述session信息,包括:sessionid,最后访问时间,用户信息等。 2、写一个过滤器对需要带token的接口统一进行session修改(修改最后访问时间) 3、使用一个线程安全的hashmap来存放Session,使用UUID+用户Id作为key 4、另起一个守护线程定时清理最后访问时间到当前时间大于指定过期时间的Session
与其如此复杂,不如直接改http client搞定。 其实就是在登录的时候,把Set-Cookie的头记下来, 然后后面的请求全部带上Cookie的头 一般http client都支持这种操作的。
疯狂熊猫人 2015-02-10
  • 打赏
  • 举报
回复
token一般不要直接放在数据库里。 自己实现一个简单的类似session管理的程序: 1、定义一个数据结构Session,用来描述session信息,包括:sessionid,最后访问时间,用户信息等。 2、写一个过滤器对需要带token的接口统一进行session修改(修改最后访问时间) 3、使用一个线程安全的hashmap来存放Session,使用UUID+用户Id作为key 4、另起一个守护线程定时清理最后访问时间到当前时间大于指定过期时间的Session
skgary 2015-02-10
  • 打赏
  • 举报
回复
引用 6 楼 liuade 的回复:
[quote=引用 4 楼 skgary 的回复:] [quote=引用 3 楼 liuade 的回复:] [quote=引用 2 楼 buliar 的回复:] 放到memcache即可. 1-若干天过期, 无需过多关注,没了重新登录就是
非常感谢,把token缓存起来,按过期时间处理是一种可行的方式。但得写代码不是。最理想的还是让应用服务器把token当sessionid一样,弄一个基于token的session。不知道这样是不是可行。[/quote] 你在客户端里的http client里加上cookie的逻辑就是了。 在response里看有没有setCookie的头,如果有的话,就需要在后续的请求里把Cookie 的header再带上去。[/quote] IOS的开发说那边没有http client似乎的东西。不熟悉ios,不知道他说得对不对。不过我看很多app似乎都是用token的。[/quote] http client都有,只不过,你要熟悉用法而已。
浪里花 2015-02-08
  • 打赏
  • 举报
回复
最近我也在做关于app方面的token登陆,我这边是把token放入到数据库中,定时清除过期token,之后再做了一层缓存,只要验证通过了就缓存一下,要查询其他信息可以通过token查询呀,做了缓存效率不会低的,据说大型网站都不适用session,效率也没低到哪里去
艾德 2015-02-07
  • 打赏
  • 举报
回复
引用 2 楼 buliar 的回复:
放到memcache即可. 1-若干天过期, 无需过多关注,没了重新登录就是
非常感谢,把token缓存起来,按过期时间处理是一种可行的方式。但得写代码不是。最理想的还是让应用服务器把token当sessionid一样,弄一个基于token的session。不知道这样是不是可行。
skgary 2015-02-07
  • 打赏
  • 举报
回复
引用 3 楼 liuade 的回复:
[quote=引用 2 楼 buliar 的回复:] 放到memcache即可. 1-若干天过期, 无需过多关注,没了重新登录就是
非常感谢,把token缓存起来,按过期时间处理是一种可行的方式。但得写代码不是。最理想的还是让应用服务器把token当sessionid一样,弄一个基于token的session。不知道这样是不是可行。[/quote] 你在客户端里的http client里加上cookie的逻辑就是了。 在response里看有没有setCookie的头,如果有的话,就需要在后续的请求里把Cookie 的header再带上去。
Defonds 2015-02-05
  • 打赏
  • 举报
回复
struts2 的 token 是放在 session 里的。 session 为空?验证 token 之前肯定会先有一次访问,session 在那次已经建立了。
buliar 2015-02-05
  • 打赏
  • 举报
回复
放到memcache即可. 1-若干天过期, 无需过多关注,没了重新登录就是

81,087

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧