单击注销按钮终止会话并重定向到登录页面

Posted

技术标签:

【中文标题】单击注销按钮终止会话并重定向到登录页面【英文标题】:Kill session and redirect to login page on click of logout button 【发布时间】:2012-11-22 08:00:55 【问题描述】:

我在 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>

当用户单击注销按钮时,我想将他重定向到登录页面并终止当前会话。我已经成功完成了重定向部分,但我不知道如何终止会话。请问这个怎么做?

【问题讨论】:

尝试使用session.invalidate()?此外,在这个主题上使用谷歌搜索将为您提供很多很好的解决方案。因为仅仅invalidating 会话是不够的。您还需要设置一些cache-headers(我不记得具体是哪个),以避免用户在注销后使用返回按钮返回到最后一页。 Prevent user from going back to the previous secured page after logout的可能重复 【参考方案1】:

试试这个杀死会话

HttpSession newsession = request.getSession(false);
    if (newsession != null) 
    
         newsession.invalidate();

    

   response.sendRedirect("../index.jsp");

【讨论】:

【参考方案2】:

你应该看看 HttpSession 的invalidate() 方法。可以通过 HttpServletRequest getSession() 方法检索会话。

您还应该查看 Expires、Cache-Control、Pragma http 标头,如:Prevent user from going back to the previous secured page after logout。

【讨论】:

【参考方案3】:

为了终止当前会话,您基本上需要调用HttpSession#invalidate() 并执行重定向到登录或主页。这段代码应该放在由 POST 请求调用的 servlet 的 doPost() 方法中。

例如

<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 如何不友好。请改用普通的&lt;a&gt; 链接。对于按钮的外观,请添加一些 CSS。

【讨论】:

以上是关于单击注销按钮终止会话并重定向到登录页面的主要内容,如果未能解决你的问题,请参考以下文章

注销后,会话未结束

如何在asp.net中恢复会话

不活动后重定向用户,但保持会话活动

如何使用 Laravel 5.3 注销并重定向到登录页面?

当用户在 JSF 中注销后单击后退按钮时重定向到登录页面 [重复]

单击按钮时弹出关闭并重定向到不同的页面!