目前我使用request.setAttribute()和request.getAttribute()作为将对象从处理程序拦截器传递给控制器方法的方法。我不认为这是一种理想的技术,因为它要求我将HttpServletRequest作为我的控制器方法的参数。 Spring在控制器中隐藏请求对象方面做得很好,所以除了这个目的,我不需要它。
我尝试使用@RequestParam注释和我在setAttribute()中设置的名称,但当然这不起作用,因为请求属性不是请求参数。据我所知,没有@RequestAttribute注释用于属性。
我的问题是,是否有一些更好的方法可以将对象从拦截器移交给控制器方法,而无需将它们设置为请求对象上的属性?
答案 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.
}