我在tomcat中使用java servlet。 我在哈希表中保存用户名和带有属性usrname的httpsession 我想知道是否有办法知道httpsession是否有效。
我试过了:
try{
String user = httpSession.getAttribute("username")
return "is valid";
}catch(IllegalStateException e){
return "is not valid";
}
得到答案,但如果我不认为“已登录”的用户从一个地方连接起来怎么办?如果我只控制我创建一个新的会话,我不知道他是否连接另一个会话。
答案 0 :(得分:10)
无需将httpSession存储在您自己的哈希中。
查看HttpServletRequest的api。如果您查看getSession(Boolean x)(传递false以便它不创建新会话)将确定会话是否有效。这是一个例子
public void doGet(HttpServletRequest req, HttpServletResponse res){
HttpSession session = req.getSession(false);
if(session == null){
//valid session doesn't exist
//do something like send the user to a login screen
}
if(session.getAttribute("username") == null){
//no username in session
//user probably hasn't logged in properly
}
//now lets pretend to log the user out for good measure
session.invalidate();
}
另一方面,如果我正确地阅读了您的问题并且您将信息存储在您自己的地图中,则需要注意不要创建内存泄漏并自行清除哈希表中的条目
答案 1 :(得分:1)
我同意肖恩的观点。我将补充一点,这种类型的检查的一个好习惯是使用过滤器
请参阅此处Servlet Filter
只需使用Sean编写的代码并将其放入Filter中。在web.xml中定义过滤器,每次请求进入时,过滤器都将执行。
这样您就可以验证用户是否为auth。不会弄乱你的servlet代码。
答案 2 :(得分:0)
您应该查看servlet上的HttpServletRequest
,并检查isRequestedSessionIdValid()
,而不是检查保存的会话是否有效。在servlet中工作时,您始终可以从Session
获取Request
,而不是将其保存到哈希表中。