在java服务器页面中关闭会话的问题

时间:2013-09-25 17:16:39

标签: jsp

我的项目中的会话有问题。
当我登录时,我做了一个会议

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/>

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

  

要再次显示网页,网络浏览器需要重新发送   您之前提交的信息   之后我回来了。   那么有没有解决方案。
先谢谢你

1 个答案:

答案 0 :(得分:1)

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

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

假设您在购物网站中,并希望在购物车中放置一些文章,并点击Buy now!进行结帐。表格数据被发送到服务器,你得到确认和钱改变口袋。现在你回去做一个刷新 - 让我们说看你的购物车现在是空的 - 会发生什么?浏览器发送另一个Buy now!,你真的想要吗?我不认为!通常你只想在点击Buy now!时购买东西,而不是因为你刚刷新页面。

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

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

这种范例称为POST/Redirect/GET