我有一个登录名和一个登录后显示的用户信息页面。如何阻止用户信息页面被用户直接访问?如何在会话中实现呢?
在登录时,将找到的User对象放入会话中。
User
String username = request.getParameter("username"); String password = request.getParameter("password"); User user = userDAO.find(username, password); if (user != null) { request.getSession().setAttribute("user", user); response.sendRedirect("secured/userpage"); } else { request.setAttribute("error", "Unknown username/password combo, please try again"); request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); }
然后实施一个Filter仅检查会话中已登录用户的存在的。
Filter
if (((HttpServletRequest) request).getSession().getAttribute("user") != null) { chain.doFilter(request, response); // Logged in, so just continue. } else { response.sendRedirect("login"); // Not logged in, redirect to login page. }
将此过滤器映射到/secured/*(或您想要的任何其他形式)的URL模式,并将受保护的页面(如用户信息页面)放在同一文件夹中。
/secured/*
要注销用户,只需执行,session.removeAttribute("user")或者更彻底地执行session.invalidate()。
session.removeAttribute("user")
session.invalidate()