0

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

例如,我打开了 home.jsp,一个依赖于 URL 模式的 content.jsp。

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

我对 Java 中的 JSESSIONID 管理感到困惑。默认情况下,如果没有会话,任何 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 吗?

我只是困惑

 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? 

谢谢。

4

3 回答 3

2

会话和访问控制没有太多共同点。未经身份验证的用户可能有一个会话。例如,仅存储首选项可能很有用。

一旦通过身份验证,您可以保持相同的会话,但将用户的身份及其授权存储在会话中。您应该只将会话视为可以为给定用户存储属性的地方,该属性将在其与您的 web 应用程序的会话期间持续存在。

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

于 2012-06-06T21:00:56.250 回答
0

这工作正常

主页.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"  
    }  

联系人.jsp

只需在此处执行相同的操作,例如
1-如果不在会话中,则重定向到 home.jsp
2-如果在会话中但session.getAttribute("authorized")给出null,然后也重定向到 home.jsp
3-如果在会话中并session.getAttribute("authorized")给出值"yes",然后
允许联系.jsp

注销时

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

但是你会面临一个问题。当您在contact.jsp 并单击浏览器的后退按钮时,您将
看到home.jsp 即登录页面,或者当您注销并进入logout.jsp 并单击
浏览器的后退按钮时,您将看到contact.jsp。为了避免这些,您必须将这3 行
放在 您想要访问控制的 每个页面中。在您的情况下, home.jsp 和 contact.jsp

<%  
    response.setHeader("Cache-Control","no-cache");  
    response.setHeader("Cache-Control","no-store");  
    response.setDateHeader("Expires", -1);  
%>
于 2012-06-09T11:32:46.917 回答
0

CREATE A LOGIN Application USING SESSION USING SERVLET 看到这篇文章并简单实用——享受程序 http://expertlogica.blogspot.in/2014/06/create-login-application-using-session.html

于 2014-06-11T06:46:24.450 回答