如何将信息存储在Web服务的上下文中?
问题描述:
我使用负责用户登录的Web服务。如果登录成功,则应该生成令牌。如何将信息存储在Web服务的上下文中?
@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/login")
public String login(@QueryParam("userName") String name,
@QueryParam("password") String password) {
//Spring Securtity Check
HttpResponse r =loginResponse(name,password);
String s = r.getFirstHeader("Location").toString();
boolean isError = s.contains("login_error");
if(!isError){
//TODO store Token in the application context
MD5 token = new MD5(name+System.currentTimeMillis());
return "token:"+token.getMD5();
}
return "fail";
}
我想令牌存储在应用程序方面,但我不知道怎么办。只要服务器应用程序正在运行,令牌就应该存在。 Web服务是否有其自己的应用程序上下文?我应该使用某种HTTP servlet来存储信息吗?
答
我不太明白你所说的应用程序上下文。
它是ServletContext吗?您可以在泽西岛使用@Context
注释获得它:@Context ServletContext
。您可以将其作为资源中的字段,或者作为您的方法的参数。
ServletContext已启动,而servlet已启动。它可能会被servlet容器根据其配置删除。
Btw。你的设计真的很糟糕,不安全。您使用GET进行登录操作,并在URL上传递用户名和密码。这意味着几件事情:
- GET请求可以由中介缓存。你想让它发生吗?
- 每个人都会在url中看到密码。即使你使用SSL,密码仍然会在网址中显示给大家。
- URL通常会被客户端,服务器和中介记录下来。你真的真的不希望密码被记录下来。
我在投票你的问题,因为这是一个不好的登录设计的好例子。
答
储存于memcached,使用它你可以将一些过期策略,以及当你有一个以上的服务器,这将是它存储在本地存储的问题,将其存储在global cache
像memcached是更apropariate 。
或redis - > http://redis.io/ – martyglaubitz 2012-10-15 15:21:34