如何在Spring MVC控制器中添加预调用方法

如何在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属性中,如

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
时是这样。