Spring Web MVC:将一个对象从处理程序拦截器传递给控制器​​?

时间:2010-09-27 17:26:39

标签: spring-mvc

目前我使用request.setAttribute()和request.getAttribute()作为将对象从处理程序拦截器传递给控制器​​方法的方法。我不认为这是一种理想的技术,因为它要求我将HttpServletRequest作为我的控制器方法的参数。 Spring在控制器中隐藏请求对象方面做得很好,所以除了这个目的,我不需要它。

我尝试使用@RequestParam注释和我在setAttribute()中设置的名称,但当然这不起作用,因为请求属性不是请求参数。据我所知,没有@RequestAttribute注释用于属性。

我的问题是,是否有一些更好的方法可以将对象从拦截器移交给控制器方法,而无需将它们设置为请求对象上的属性?

4 个答案:

答案 0 :(得分:1)

使用拦截器预处理方法和会话,如下所示:

拦截器:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    if (!(handler instanceof HandlerMethod)) {
        return true;
    }
    HttpSession session = request.getSession();
    String attribute = "attribute";
    session.setAttribute("attributeToPass", attribute);
    return true;
}

控制器:

@RequestMapping(method = RequestMethod.GET)
public String get(HttpServletRequest request) {
    String attribute = (String)request.getSession().getAttribute("attribteToPass");
    return attribute;
}

答案 1 :(得分:0)

我认为没有。

但是您可以滚动自己的@RequestAttribute注释。有关类似问题,请参阅spring mvc annotation @RequestAttribute similar to @RequestParam并链接到来源。

答案 2 :(得分:0)

为了节省访问此页面的人的时间:因为Spring 4.3 @RequestAttribute注释是Spring MVC的一部分,所以不需要创建自己的@RequestAttribute注释。

答案 3 :(得分:0)

使用 @RequestAttribute 的示例:

拦截器

@Component
public class ExampleRequestInterceptor
        implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // Logic to verify handlers, you custom logic, etc.

        // Just for illustration, I'm adding a `List<String>` here, but
        // the variable type doesn't matter.
        List<String> yourAttribute = // Define your attribute variable
        request.setAttribute("yourAttribute", yourAttribute);
        return true;
    }
}

控制器

public ResponseEntity<?> myControllerMethod(@RequestParam Map<String, String> requestParams, @RequestAttribute List<String> yourAttribute) {
    // `yourAttribute` will be defined here.
}