在Java servlet中显式管理会话以保护Web应用程序

时间:2012-06-06 20:52:26

标签: java security jsp session servlets

我正在开发一个安全的Web应用程序。我必须开发一个servlet来自定义控制它的访问。

例如,我有home.jsp open open,一个依赖于URL模式的content.jsp。

如果它是GET content.jsp,它应该是全开的以显示内容列表。 如果它的content.jsp?chapter = 1& detail = true,它应该检查用户是否登录,只有当用户具有适当的访问权限时,它才会授予权限,否则,将其重定向到登录页面。

我对Java中的JSESSIONID管理感到困惑。默认情况下,如果没有JSP,任何JSP都会自动创建会话。我知道我可以使用@page session =" false"覆盖其默认行为。

所以,我猜逻辑就像这样

  1. 如果用户(尚未登录)GET home.jsp,我不应该在servlet中创建任何会话。但是JSP应该创建一个。我发现在HTTP请求头中,它发送了JSESSIONID值。但是,如何在服务器端,我不会通过httpServletRequest.getSession(false)获得任何会话?

  2. 如果用户想要获取content.jsp?chapter = 1& detail = true,我会将其重定向到logon.jsp。提交登录表单后,是否应该使用httpServletRequest.getSession(true)在服务器端(返回之前)创建新会话?以下JSP页面访问是否会创建新会话?

  3. 当用户注销时,我必须调用session.invalidate()来使其无效。但是,以下任何JSP页面是否会创建新的会话ID?

  4. 我很困惑

     When should I call getSession(true) and getSession(false)? I assume per user session, I should call getSession(true) once.
     Which session id should I use (trust) to identify if the user is truly logged on? 
    

    感谢。

3 个答案:

答案 0 :(得分:2)

会话和访问控制没有太多共同之处。未经身份验证的用户可能有会话。例如,它可以用于存储首选项。

经过身份验证后,您可以保留相同的会话,但会在会话中存储用户及其授权的身份。您应该只将会话视为可以存储给定用户的属性的位置,该位置将持续使用您的webapp进行会话。

要恢复,会话的存在并不意味着用户已通过身份验证。您的身份验证机制在会话中存在一些“已验证”标志或会话中的某些标识,您必须检查以了解用户是否已通过身份验证。

答案 1 :(得分:0)

这很好用

home.jsp

session = request.getSession(false);  
//false: new session will not be created  

if(session == null){  
    //not in a session  
    //allow to view the home.jsp page and to login  
    //set an attribute into session  
    session.setAttribute("authorized","yes");  
}  
else{//in case a default session automatically establishes  
    if(session.getAttribute("authorized")==null){  
    //not in a valid session  
    //allow to login  
    }  
    else{//already in session, so cann't view the login page  
    //redirect to the home page by "RequestDispatcher"  
    }  

contact.jsp

就像在这里做同样的事情 1 - 如果不在会话中,则重定向到home.jsp
2 - 如果在会话中但session.getAttribute("authorized")提供null,则还会重定向到home.jsp
3 - 如果在会话中且session.getAttribute("authorized")给出值"yes",则为 允许联系.jsp

退出时

session.removeAttribute("authorized");  
session.invalidate();  

但你会遇到一个问题。当你在contact.jsp并点击浏览器的后退按钮时,你将会 当您注销并登录logout.jsp并点击后面时,请查看home.jsp,即登录页面 浏览器按钮,你会看到contact.jsp。要避免这些,您必须在每个页面中添加 3行 你希望在哪里有访问控制。在你的情况下,home.jsp和contact.jsp

<%  
    response.setHeader("Cache-Control","no-cache");  
    response.setHeader("Cache-Control","no-store");  
    response.setDateHeader("Expires", -1);  
%>

答案 2 :(得分:0)

使用SERVLET使用会话创建登录应用程序查看此帖子并轻松实用 - 享受程序 http://expertlogica.blogspot.in/2014/06/create-login-application-using-session.html