0

我正在处理Spring 4 mvc带有mysql数据库、tomcat服务器的应用程序。基本上,我正在创建一个将由Angular JS.

注意:我没有使用Spring security

为了避免在这种情况下进行会话复制clustered environment,我正在使用cookie方法。登录时,我正在生成one unique session id( using java UUID) 并使用它来创建一个cookie,然后在响应中设置 cookie。此外,将该会话 ID 与任何用户一起存储在数据库中数据。

为了验证每个 REST API,我编写了一个Spring interceptor将拦截每个 REST API 调用,然后检查请求中是否存在 cookie。如果存在,我正在获取会话 id 值并使用它,创建一个数据库打电话检查它是否有效。注销时,我正在删除 cookie。

根据我上面解释的做法,我有几个问题:

1) Is my approach correct? or do you see any flaw in it.  
2) Let me know if there is any other better method to achieve the same i.e. to avoid session replication.  
3) Since, I am not using any HTTP session, how do I achieve something like session-timeout or do i even need it?
4

1 回答 1

0

1)我的方法正确吗?或者你有没有看到它的任何缺陷。

这是一个很好的方法。只是按优先顺序排列的几点:-

  • 如果您使用 API 来处理大量请求,请考虑使用内存缓存而不是 DB。去DB相对要贵得多。我知道很多是主观的,这取决于您的设置,但只需考虑您希望在会话之外存在的数据的数据库。最好使用更临时/更快的存储,例如用于 API 令牌之类的内存缓存。如果跨集群,则探索分布式缓存解决方案。

  • 使用 cookie 不一定有安全风险,但对CSRF有一点了解。在 HTTP 标头而不是 cookie 本身中传递令牌更安全 - 也就是说,如果您担心 CSRF(我确实在我自己的应用程序中使用 Header 方法,但我认为 CSRF 相对罕见,这取决于您的敏感程度数据是)

2)让我知道是否有任何其他更好的方法来实现相同的,即避免会话复制。

没有什么可以增加对 1 的响应。)

3)因为,我没有使用任何 HTTP 会话,我如何实现会话超时之类的东西,或者我什至需要它吗?

使用令牌存储(最好在缓存中)时间戳,并在缓存中为每个使用令牌的事务刷新它。然后,在检查您是否考虑令牌是否有效时,检查时间戳,您可以决定(基于经过的时间)是否要删除令牌并请求客户端重新进行身份验证。

于 2015-09-16T16:03:03.420 回答