代码之家  ›  专栏  ›  技术社区  ›  hleinone

使用Spring的@RequestBody,然后读取HttpServletRequest.getInputStream

  •  5
  • hleinone  · 技术社区  · 14 年前

    我正在使用Spring的 @RequestBody 注释和 MappingJacksonHttpMessageConverter . 但是在那之后我想把数据读入 String 表单进行一些额外的身份验证。但当编组发生时 InputStream 在里面 HttpServletRequest @请求体 字符串 按预期工作。

    我必须妥协放弃 @请求体

    3 回复  |  直到 14 年前
        1
  •  2
  •   axtavt    14 年前

    所以,基本上你需要计算请求体的散列。优雅的方法是在 InputStream .

    @RequestBody 需要创造 HttpMessageConverter 手动):

    @RequestMapping(...)
    public void handle(HttpServletRequest request) throws IOException {
        final HashingInputStreamDecorator d = 
            new HashingInputStreamDecorator(request.getInputStream(), secretKey);
        HttpServletRequest wrapper = new HttpServletRequestWrapper(request) {
            @Override
            public ServletInputStream getInputStream() throws IOException {
                return d;
            }
        };
    
        HttpMessageConverter conv = ...;
        Foo requestBody = (Foo) conv.read(Foo.class, new ServletServerHttpRequest(wrapper));
        String hash = d.getHash();
    
        ...
    }
    

    read 方法 HashingInputStreamDecorator .

    你也可以使用 如果您创建 Filter 去申请装修师。在这种情况下,decorator可以将计算出的哈希作为请求属性传递给handler方法。但是,您需要仔细映射此筛选器,以便仅将其应用于特定处理程序方法的请求。

        2
  •  0
  •   Eugene Kuleshov    14 年前

      <bean id="urlMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
        <property name="interceptors">
          <list>
            <bean class="org.foo.MyAuthInterceptor"/>
          </list>
        </property>
      </bean>
    

    这些拦截器可以访问HttpServletRequest,但如果从流中读取,则参数映射器可能无法读取它。

    public class AuthInterceptor extends HandlerInterceptorAdapter {
    
      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        ...
      }
    
      public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mav) {
        ...
      }
    }
    
        3
  •  0
  •   StaxMan    14 年前