0

我习惯于HandlerMethodArgumentResolverComposite为我的项目实现自定义,但现在在某些方法中我有重复的代码块

...
if (param != null){
    return SiteMap.withRedirect(HOME); // resolves to "redirect:/home"
}
...

有没有一种精简的方法可以在控制器方法之外执行此块?

提前致谢。

对此的回答:

HandlerMethod.getMethodAnnotation(Class<T>)会有很大帮助:D

https://gist.github.com/dgomesbr/5657473

public class UserRequiredAnnotationInterceptor extends HandlerInterceptorAdapter
{
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
    {
        if (handler == null)
        {
            return true;
        }

        if (((HandlerMethod) handler).getMethodAnnotation(RequiredUser.class) != null)
        {
            final Object userkey = request.getSession().getAttribute(LoginFilter.CURRENT_LOGGED_USER_ATTRIBUTE);
            if (userkey == null)
            {
                response.sendRedirect(SiteMap.HOME_REDIRECT);
                return false;
            }
        }

        return true;
    }
}
4

2 回答 2

1

弹簧拦截器将是要走的路。

于 2013-05-26T15:47:26.557 回答
1

您可以使用方法实现拦截器preHandle()

preHandle(..) 方法返回一个布尔值。您可以使用此方法中断或继续执行链的处理。当此方法返回 true 时,处理程序执行链将继续;当它返回 false 时,DispatcherServlet 假定拦截器本身已经处理了请求(例如,呈现了适当的视图)并且不会继续执行其他拦截器和执行链中的实际处理程序。

但是,由于preHandle()不返回String像您的控制器方法一样的拦截器实现,因此拦截器实现将遵循

if (request.getParameter(yourParam) == true) {
  return true;
} else (
  response.sendRedirect(redirectPath);
  return false;
}

或者,您当然可以将几乎相同的代码放入 Servlet 过滤器中。主要区别在于 MVC .xml 文件中的拦截器配置使您可以更精细地控制拦截器应映射到的“URL 模式”(即您的控制器方法)。

于 2013-05-26T22:42:31.943 回答