0

我的项目中的会话有问题。
当我登录时,我进行了一次会话

session.setAttribute("userid",userid);

当我注销时,我的注销页面为:

<html>
<head>
<title>Logged out</title>
</head>
<body bgcolor="#CCFFFF">
    <%@  page errorPage="errorpage.jsp" language="java" %>
    <%
    session.invalidate();
    %>
        <center>
    <BR><BR><BR><BR><b>You have logged out successfully.
        <BR><BR>Return to Exam Portal? <a href="signup.html">Click here</a></b>
        </center>
</body>
</html>

在每个页面中,我通过将头文件包括在内来检查会话是否为空:

<%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*,java.util.*" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Online Exam Portal</title>
</head>
<body>
<%
if(session.getAttribute("userid")==null)
{
%>
<jsp:forward page="signup.html"/>
<%
}
%>
<img src="exam_header01.jpg"/>
<br />
Welcome <%=session.getAttribute("userid")%>
<a href="ChangePassword.jsp">Change Password</a> 
<a href="logout.jsp">Logout</a> 

<hr/>

每次我登录浏览页面和注销时,我都会被重定向到注册页面,即使我在按下后退按钮后尝试通过 url 或任何链接输入,我也会被重定向,这是预期
的但问题是:
在按下后退按钮并刷新页面 3我收到一条消息:

要再次显示网页,网络浏览器需要重新发送您之前提交的信息,然后我将恢复我的会话。那么有没有办法解决这个问题。
先感谢您

4

1 回答 1

1

这不是您的会话的问题,而是您如何在应用程序中处理 POST 请求的问题。当您执行 POST 请求时,浏览器会将表单数据发送到浏览器。如果您使用浏览器导航返回并尝试刷新页面,浏览器会尝试向服务器发送相同的请求,并且由于最后一个请求是 POST 请求,浏览器会警告您它将再次重新发送表单数据。浏览器显示此警告以确保您确实想再次提交表单并希望您明确地说Yes(实际上您应该始终说No,除非您知道自己在做什么/后果是什么)。

那么为什么浏览器会在刷新时要求确认重新提交呢?

假设您在一个购物网站中,并且想要将一些商品放入您的购物车并通过单击 结帐Buy now!。表单数据被发送到服务器,你得到确认,钱就换了口袋。现在你回去刷新一下——假设看看你的购物车现在是否是空的——会发生什么?浏览器发送另一个Buy now!,你真的想要吗?我不认为!通常您只想在点击时购买东西,Buy now!而不是因为您刚刚刷新页面。

另一个与身份验证有关的示例。假设您正在浏览一个需要进行身份验证的站点(例如用户名/密码)。完成后,你打log out。然后你把电脑留给另一个人。然后那个人使用浏览器导航返回登录页面,然后点击刷新,会发生什么?浏览器询问/警告它将再次发送表单数据,这恰好是您的身份验证信息。现在,其他人可以使用您的身份浏览该网站。你真的想要那个吗?我不这么认为。

总而言之,在 POST 请求之后直接写入响应的输出是不好的做法。相反,您需要触发重定向,以便浏览器可以通过发送 GET 请求自行请求下一页。

这种范式称为POST/Redirect/GET

于 2013-09-25T17:45:13.903 回答