我可以想出几种方法来实现你想要的。
首先,您可以使用 Spring Security taglib 有条件地在您的视图模板中呈现内容,具体取决于用户是否经过正确的身份验证。有关 Spring Security taglib 的更多信息在这里。粗略地说,这会使您的视图模板看起来像:
if(user is authenticated)
render content for authenticated user
else
render log-in form
然而,这感觉有点生硬,因为无论您的用户是否经过正确身份验证,您的控制器都会始终创建模型。每当您想显示登录表单时,您还需要在视图模板中使用此逻辑。
另一种方法是创建一个HandlerInterceptor实现,它将所有请求转发到负责呈现登录页面的控制器,直到用户完全通过身份验证。您可以使用 HandlerInterceptor 的 preHandle() 方法来执行此操作:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyHandlerInterceptor implements HandlerInterceptor
{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
SecurityContext sc = SecurityContextHolder.getContext();
boolean userAuthenticated = true;
/* Some logic in here to determine if the user is correctly authenticated */
if(!userAuthenticated)
{
request.getRequestDispatcher("/login").forward(request, response);
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
{
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
{
}}
然后,您可以配置 Spring MVC 以将您的 HandlerInterceptor 实现映射到您需要此功能的 URL。这避免了您必须在所有控制器之间复制逻辑并且易于测试。