如何检查用户是否在Servlet中登录?
在Java Servlet中,我想以编程方式检查用户是否已登录 。
另一个答案中指出的HttpServletRequest#getUserPrincipal()
仅适用于您使用此处概述的Java EE提供的容器管理安全性。
但是,如果您正在为自己的安全性增长,那么您需要依赖于HttpSession
。 这并不难,这里概述了每个步骤需要实现的内容:
登录时,从数据库中获取User
并将其存储在servlet的 doPost()
中的会话中:
User user = userDAO.find(username, password); if (user != null) { session.setAttribute("user", user); } else { // Show error like "Login failed, unknown user, try again.". }
注销时,只需在servlet的doPost()
会话无效。 它会破坏会话并清除所有属性。
session.invalidate();
要检查User
是否已登录,请创建一个filter ,该filter使用覆盖受限页面的url-pattern
映射,例如/secured/*
, /protected/*
,etcetera和如下所示的doFilter()
:
if (session.getAttribute("user") == null) { response.sendRedirect(request.getContectPath() + "/login"); // Not logged in, redirect to login page. } else { chain.doFilter(request, response); // Logged in, just continue chain. }
这基本上都是。
也可以看看:
- 如何在Java Web应用程序中将会话过期时重定向到“登录”页面?
- 如何处理数据库中用户的身份validation/授权?
HttpServletRequest.getUserPrincipal()
Java Servlet 3.1规范 (第13.10节)规定:
在处理请求期间登录到应用程序,恰好对应于与请求关联的有效非
null
者身份,可以通过在请求上调用getRemoteUser
或getUserPrincipal
来确定。 来自这些方法之一的null
返回值表示调用者未针对请求的处理登录到应用程序。