我正在开发一个安全的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"覆盖其默认行为。
所以,我猜逻辑就像这样
如果用户(尚未登录)GET home.jsp,我不应该在servlet中创建任何会话。但是JSP应该创建一个。我发现在HTTP请求头中,它发送了JSESSIONID值。但是,如何在服务器端,我不会通过httpServletRequest.getSession(false)获得任何会话?
如果用户想要获取content.jsp?chapter = 1& detail = true,我会将其重定向到logon.jsp。提交登录表单后,是否应该使用httpServletRequest.getSession(true)在服务器端(返回之前)创建新会话?以下JSP页面访问是否会创建新会话?
当用户注销时,我必须调用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?
感谢。
答案 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