2011-07-15 34 views
2

我在tomcat中使用java servlet。 我保存在散列表中的用户名和httpsession属性usrname 我想知道是否有方法知道httpsession是否有效。java httpsession有效吗?

我想:

try{ 
    String user = httpSession.getAttribute("username") 
    return "is valid"; 
}catch(IllegalStateException e){ 
    return "is not valid"; 
} 

TNKS的答案,但我怎么能如果我不惯于一个“登录”的用户从更多的一处连接呢?如果我仅在创建新会话的时候控制,我无法知道他是否连接到另一个会话。

回答

1

而不是检查保存的会话是否有效,您应该查看servlet上的HttpServletRequest,然后检查isRequestedSessionIdValid()。在servlet中工作时,您始终可以从请求中获取Session,而不是将其保存到散列表中。

+0

这实际上并没有什么帮助,因为您仍然需要处理(或接受)出现非法StatException的可能性。因为在检查和会话获取之间的微秒内,会话可能失效。 – MJB

+0

我的(也许是不正确的)假设是tomcat在传递servlet请求之前看到会话ID,它会检查它是否超时,如果不重置时间以保持会话存活无论默认会话长度是多少。没有? –

+1

但是你可以同时有一个注销请求。多线程,多servlet,还记得吗? – MJB

9

无需将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

我同意肖恩。我补充一点,对于这种类型的检查的良好做法是使用过滤

看到这里Servlet Filter

只要看看肖恩写的代码,并把它放在一个过滤器来代替。定义你在web.xml中进行过滤,并且每次有请求进入时,过滤器都会执行。

这样你可以验证用户是否是auth。而不会混淆你的servlet代码。

+0

是的,过滤器将工作。我想在我的例子中展示基础知识。 只有一个servlet,可以在servlet中执行此检查,但在开始管理多个servlet时会变得非常混乱。在这种情况下移动到过滤器更好 – Sean

+0

你是对的,你的回应非常好..只是想添加我的2美分 – Cygnusx1