6

我正在使用 Spring MVC,并且具有更新用户配置文件的功能:

@RequestMapping(value = "/{userName}" + EndPoints.USER_PROFILE,
    method = RequestMethod.PUT)
public @ResponseBody ResponseEntity<?> updateUserProfile(
    @PathVariable String userName, @RequestBody UserProfileDto userProfileDto) {
    // Process update user's profile
} 

我已经开始使用 JMeter,由于某种原因,他们在发送带有正文的 PUT 请求时遇到问题(在请求正文中或使用请求参数破解)。

我知道在 Jersey 你可以添加一个过滤器来处理 X-HTTP-Method-Override 请求参数,这样你就可以发送一个 POST 请求并使用 header 参数覆盖它。

在 Spring MVC 中有没有办法做到这一点?

谢谢!

4

2 回答 2

14

Spring MVC 有HiddenHttpMethodFilter,它允许你包含一个请求参数 ( _method) 来覆盖 http 方法。您只需要将过滤器添加到 web.xml 中的过滤器链中。

我不知道使用X-HTTP-Method-Override标头的开箱即用解决方案,但是您可以创建一个类似于您HiddenHttpMethodFilter自己的过滤器,它使用标头来更改值而不是请求参数。

于 2013-03-12T17:46:55.173 回答
9

您可以将此类用作过滤器:

public class HttpMethodOverrideHeaderFilter extends OncePerRequestFilter {
  private static final String X_HTTP_METHOD_OVERRIDE_HEADER = "X-HTTP-Method-Override";

  @Override
  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
      throws ServletException, IOException {
    String headerValue = request.getHeader(X_HTTP_METHOD_OVERRIDE_HEADER);
    if (RequestMethod.POST.name().equals(request.getMethod()) && StringUtils.hasLength(headerValue)) {
      String method = headerValue.toUpperCase(Locale.ENGLISH);
      HttpServletRequest wrapper = new HttpMethodRequestWrapper(request, method);
      filterChain.doFilter(wrapper, response);
    }
    else {
      filterChain.doFilter(request, response);
    }
  }

  private static class HttpMethodRequestWrapper extends HttpServletRequestWrapper {
    private final String method;

    public HttpMethodRequestWrapper(HttpServletRequest request, String method) {
      super(request);
      this.method = method;
    }

    @Override
    public String getMethod() {
      return this.method;
    }
  }
}

来源:http: //blogs.isostech.com/web-application-development/put-delete-requests-yui3-spring-mvc/

于 2015-12-01T10:04:34.010 回答