注销后,会话未结束
Posted
技术标签:
【中文标题】注销后,会话未结束【英文标题】:After logout, session is not ending 【发布时间】:2015-03-30 18:50:48 【问题描述】:我创建了一个 java 登录应用程序,其中一切正常,但是当我单击注销按钮时,它成功注销并重定向到 index.jsp,但在 index.jsp 页面中,如果我打印会话值,那么它正在打印一样,不知道为什么??但是,在注销时我已经终止了会话。以下是代码,请提出可能的原因:
index.jsp 页面下面是检查会话是否存在的代码。注销后打印“isession is not null”...
<%
if (session == null)
System.out.println("session is null");
session.removeAttribute("username");
session.removeAttribute("uniqueID");
session.invalidate();
else if(session != null)
System.out.println("isession is not null");
System.out.println(session);
%>
loginServlet.java
String name = "";
JSONObject obj = result_array.getJSONObject(0);
String res = obj.get("result").toString();
HttpSession session = null;
if (res.equals("true"))
try
name = obj.get("name").toString();
session = request.getSession(true);
session.setAttribute("username", name);
session.setAttribute("uniqueID", uname);
//setting session to expiry in 15 mins
session.setMaxInactiveInterval(15*60);
Cookie userName = new Cookie("user", uname);
userName.setMaxAge(15*60);
response.addCookie(userName);
if("0".equals(obj.get("role").toString()))
session.setAttribute("role", "user");
response.sendRedirect("home.jsp");
else if("1".equals(obj.get("role").toString()))
session.setAttribute("role", "admin");
response.sendRedirect("AdminHome.jsp");
catch (JSONException ex)
System.out.println(getClass().getName()+" = " +ex.toString());
this.context.log(ex.toString());
logoutservlet.java
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
response.setContentType("text/html");
// Cookie[] cookies = request.getCookies();
// if (cookies != null)
// for (Cookie cookie : cookies)
// if (cookie.getName().equals("JSESSIONID"))
// System.out.println("JSESSIONID=" + cookie.getValue());
// break;
//
//
//
Cookie loginCookie = null;
Cookie[] cookies = request.getCookies();
if (cookies != null)
for (Cookie cookie : cookies)
if (cookie.getName().equals("user"))
loginCookie = cookie;
break;
if (loginCookie != null)
loginCookie.setMaxAge(0);
response.addCookie(loginCookie);
PrintWriter out = response.getWriter();
HttpSession session = request.getSession(false);
if (session != null)
session.removeAttribute("username");
session.removeAttribute("uniqueID");
session.removeAttribute("role");
session.invalidate();
out.print("You have Succefully logged out ");
response.sendRedirect("index.jsp");
out.flush();
out.close();
【问题讨论】:
【参考方案1】:默认情况下,会自动为 JSP 创建会话,除非它当然已经存在。因此,注销后,当您再次检查隐式 session
对象时,它是一个新对象。
您可以通过打印来验证这一点
<%= session.isNew() %>
要为特定 JSP 关闭此功能,您需要设置 page
指令的 session
属性。
<%@ page session="false" %>
这似乎没有必要,因为登录/退出状态总是可以由会话属性的存在而不是会话本身的无效性来确定。
【讨论】:
以上是关于注销后,会话未结束的主要内容,如果未能解决你的问题,请参考以下文章
在结束会话 URI 中使用 IP 地址时,OpenId Connect 用户未注销(发现文档 end_session_endpoint)。使用 Gluu 身份服务器