【问题标题】:How to add Precall method in Spring MVC Controller如何在 Spring MVC 控制器中添加 Precall 方法
【发布时间】:2012-01-05 07:51:36
【问题描述】:

我有一个要求要满足。

实际上,当用户登录到我的应用程序时,我会将登录的用户名保存在会话属性中,例如。

session.setAttribute("LOGIN_USER", userName);

因此,如果用户尝试直接访问我的方法链接而不来自登录页面,我可以在控制器方法中检查此会话是否具有如下特定属性值,并且我可以限制用户访问该页面并将他重定向到登录页面。

if(request.getSession(false).getAttribute("LOGIN_USER")==null)
 //redirect to login page

现在,我的要求是,如果我在控制器中有 50 个方法,我不能在每个方法中添加这个条件。我认为有一种方法可以在控制器类中添加某种过滤器或任何方法,例如 ex @preExecuteMethod首先执行此方法,如果成功则继续进行实际调用。

【问题讨论】:

    标签: spring jakarta-ee spring-mvc


    【解决方案1】:

    是的,您可以为此使用HandlerInterceptor。请参阅文档 herehere

    【讨论】:

    • 如何将它用于基于注释的控制器?
    • @Rana:阅读我刚刚链接到的文档,然后试一试。如果您无法使其正常工作,请提出另一个问题,向我们展示您的尝试。
    【解决方案2】:

    拦截器是解决方案。它有方法 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);
        }
    }
    

    【讨论】:

    • 即使它已被构造,preHandle 似乎也从未被调用,至少在使用 MockMvc 时不会被调用。
    【解决方案3】:

    也许您可以使用 AOP @Before 方面为处理程序类中的方法提供切入点?请参阅参考 here 或者您可以通过 delegatingFilterProxy 解释的 here 创建普通过滤器。我认为总的来说@skaffman 给出了一个更好的主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      相关资源
      最近更新 更多