我在JSP中有以下代码:
<%
if(session.getAttribute("Username") == null || session.getAttribute("Username") == "_INVALID_")
{
response.sendRedirect("LoginPage.html");
}
%>
<form>
<input type="button" value="Change Account Details" onClick="location.href='ChangeDetails.jsp'">
<br></br>
<input type="button" value="Add Customers" onClick="location.href='AddCustomers.jsp'">
<br></br>
<input type="button" value="Manage Flights" onClick="location.href='ManageFlights.jsp'">
<br></br>
<input type="button" value="Book Flights" onClick="location.href='BookFlights.jsp'">
<br></br>
<input type="button" value="Log Out" onClick="location.href='LoginPage.html'">
</form>
当用户点击退出按钮时,我想将他重定向到登录页面并终止当前会话。我已成功完成重定向部分,但我不知道如何终止会话。怎么可以这样做?
答案 0 :(得分:20)
为了终止当前会话,您基本上需要调用HttpSession#invalidate()
并执行重定向到登录或主页面。此代码应放在servlet的doPost()
方法中,该方法由POST请求调用。
E.g。
<form action="${pageContext.request.contextPath}/logout" method="post">
<input type="submit" value="Logout" />
</form>
与
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getSession().invalidate();
response.sendRedirect(request.getContextPath() + "/LoginPage.html");
}
}
无关具体问题,您的用户名检查代码不在正确的位置。您不应该在每个JSP页面上复制相同的代码。您应该在servlet filter的单个位置执行此作业。 JSP文件中的Java代码应尽可能avoided。
此外,当最终用户使用浏览器的后退按钮导航回历史记录时,还存在另一个潜在问题。默认情况下,浏览器将缓存所有响应,因此后退按钮可能会显示浏览器缓存中的页面,而不是从服务器请求全新的响应。要解决此问题,请参阅此相关问题Prevent user from seeing previously visited secured page after logout
最后但并非最不重要的是,你有一些非常奇怪的HTML。导航onClick
的按钮?用户和SEO如何不友好。请改用普通<a>
链接。对于按钮look'n'feel,扔进一些CSS。
答案 1 :(得分:2)
你应该看一下HttpSession的invalidate()方法。可以通过HttpServletRequest getSession()方法检索会话。
您还应该查看Expires,Cache-Control,Pragma http标头,如:Prevent user from going back to the previous secured page after logout。
答案 2 :(得分:1)
尝试此操作以终止会话
HttpSession newsession = request.getSession(false);
if (newsession != null)
{
newsession.invalidate();
}
response.sendRedirect("../index.jsp");