我正在使用MVC框架创建一个项目,其中我在多个页面上创建了会话,并且在每个页面上都有一个锚标记显示(注销),用户将用户重定向到第一页(登录页面)。我想要做的是当用户被重定向到登录页面时,如果是,则检查是否已经存在会话,然后它会使会话无效,并且用户必须再次登录。但是当我点击提交而没有填写用户名/密码时,我的代码在会话无效后仍无效,它仍然需要旧值...请告诉我哪里出错了?
<jsp:useBean id="theBean" class="pack.java.MyModel"/>
<jsp:setProperty name="theBean" property="name" param="userName"/>
<jsp:setProperty name="theBean" property="pass" param="userPass"/>
<%@ taglib uri="/WEB-INF/jsp2/taglib1.tld" prefix="easy" %>
<html>
<head>
</head>
<body >
<form method="post">
<h1>Login please</h1>
Enter username : <input type = text name = userName >
</br>
Enter password : <input type = password name = userPass >
</br>
<input type = submit name = submit value = submit>
</br>
<%
HttpSession session=request.getSession(false);
if(session!=null)
{
session.invalidate();
}
String btn = request.getParameter("submit");
if(btn!=null)
{
%>
<easy:myTag/>
<%
}
%>
</form>
</body>
</html>
答案 0 :(得分:1)
取决于框架
代码
<%
session.invalidate();
%>
使会话无效,但“easy:myTag”的作用是什么?
在单独的页面中将会话无效;如果它有效,你必须调查自定义标签myTag。
答案 1 :(得分:0)
您的疑问是您在响应标头后调用invalidate方式。一旦jsp被转换为servlet,html代码就在那些命令行之前。
尝试将其放在<hmtl>
标记之前。
在幕后,系统从cookie或中提取用户ID 附加的URL数据,然后使用该ID作为表的键 以前创建过的HttpSession对象。但这一切都已完成 对程序员透明:你只需要调用getSession。如果不 会话ID在传入的cookie或附加的URL信息中找到, 系统会创建一个新的空会话。而且,如果是饼干 使用(默认情况),系统也创建一个传出 cookie名为JSESSIONID,具有表示会话的唯一值 ID。因此,虽然您在请求中调用getSession,但调用可以 影响响应。 因此,您可以致电 request.getSession仅在设置HTTP响应合法时才有效 标题:在发送任何文档内容之前(即,刷新或 承诺)给客户。
如本文件所述: http://www.java-programming.info/tutorial/pdf/csajsp2/08-Session-Tracking.pdf
从这个网站: http://courses.coreservlets.com/Course-Materials/csajsp2.html
有关更多一般信息:
丢弃会话数据
完成用户的会话数据后,您有三个选择。
•仅删除servlet创建的数据。你可以打电话 removeAttribute(&#34; key&#34;)丢弃与之关联的值 指定的密钥。这是最常见的方法。
•删除整个会话(在当前的Web应用程序中)。您可以 调用invalidate以丢弃整个会话。只记得那样做 所以导致所有用户的会话数据丢失,而不仅仅是 您的servlet或JSP页面创建的会话数据。所以,所有的 Web应用程序中的servlet和JSP页面必须就案例达成一致 可以调用无效的。
•将用户注销并删除属于他或她的所有会话。 最后,在支持servlet 2.4和JSP 2.0的服务器中,您可以 调用logout以将客户端记录到Web服务器之外并使所有客户端无效 与该用户关联的会话(每个Web应用程序最多一个)。 同样,由于此操作会影响您自己以外的servlet,因此请确保 协调使用logout命令与其他开发人员 你的网站。