如何在Spring MVC控制器中添加预调用方法
我有一个要求要满足 实际上,当任何用户登录到我的应用程序时,我都会将登录的用户名保存在session属性中,如如何在Spring MVC控制器中添加预调用方法,spring,jakarta-ee,spring-mvc,Spring,Jakarta Ee,Spring Mvc,我有一个要求要满足 实际上,当任何用户登录到我的应用程序时,我都会将登录的用户名保存在session属性中,如 session.setAttribute("LOGIN_USER", userName); 所以,如果用户试图直接访问我的方法链接,而不从登录页面出来,我可以在控制器方法中检查此会话是否具有如下所示的特定属性值,并且我可以限制用户访问该页面并将其重定向到登录页面 if(request.getSession(false).getAttribute("LOGIN_USER")==null
session.setAttribute("LOGIN_USER", userName);
所以,如果用户试图直接访问我的方法链接,而不从登录页面出来,我可以在控制器方法中检查此会话是否具有如下所示的特定属性值,并且我可以限制用户访问该页面并将其重定向到登录页面
if(request.getSession(false).getAttribute("LOGIN_USER")==null)
//redirect to login page
现在,我的要求是,如果控制器中有50个方法,我不能在每个方法中添加此条件。我认为有一种方法可以在控制器类中添加某种过滤器或任何方法,如ex@preExecuteMethod,首先执行此方法,如果成功,则继续实际调用。是,为此,您可以使用
HandlerInterceptor
。请参阅文档和。在为处理程序类中的方法提供切入点之前,是否可以使用AOP@方面?请参阅参考资料,或者您可以通过说明创建一个普通过滤器。我认为总体上@skaffman给出了一个更好的主意。拦截器是解决方案。它有方法preHandler,在每个请求之前调用这些方法。您可以连接到每个HTTPServletRequest对象并执行必要的操作
下面是一个示例代码:
@Component
public class AuthCodeInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// set few parameters to handle ajax request from different host
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
response.addHeader("Access-Control-Max-Age", "1000");
response.addHeader("Access-Control-Allow-Headers", "Content-Type");
response.addHeader("Cache-Control", "private");
String reqUri = request.getRequestURI();
String serviceName = reqUri.substring(reqUri.lastIndexOf("/") + 1,
reqUri.length());
if(request.getSession(false).getAttribute("LOGIN_USER")==null) {
//redirect to login page
}
return super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
}
}
我如何将其用于基于注释的控制器?@Rana:阅读我刚刚链接到的文档,然后试一试。如果您在使其工作时遇到困难,请询问另一个问题,告诉我们您尝试了什么。即使它是构造的,
preHandle
似乎从未被调用,至少在使用MockMvc
时是这样。