【问题标题】:How to forward HttpServletRequest data second time to REST controller using Spring Interceptor?如何使用 Spring Interceptor 将 HttpServletRequest 数据第二次转发到 REST 控制器?
【发布时间】:2019-12-07 12:02:41
【问题描述】:

第 1 步:

在preHandle(HttpServletRequest request, HttpServletResponse 响应,对象处理程序){},如下所示

@Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {        
                ServletContext query = request.getServletContext();
            BufferedReader br = request.getReader();
            StringBuilder sb = new StringBuilder();
            String s = "";
            while((s = br.readLine())!=null) {
                sb.append(s);
            }
            System.out.println(sb.toString());
   return true;
}

第 2 步: 一旦 preHandle(request, response) 方法作业完成然后请求控制到达 Rest Controller 所以这里的请求正文为空

@PostMapping(value = "/addOrRemoveCustomer", produces = { "application/json" }, consumes = {"application/json" })
    public ResponseEntity<Object> addOrRemoveCustomer(@RequestBody Map<String, Object> requestBody) {
        logger.debug("addOrRemoveCustomer : addOrRemoveCustomer() start....");
        Object requestData = null;

        try {
            requestData = customerService.addOrRemoveCustomer(requestBody);
        } catch (BusinessException e) {
            BusinessException businessException = new BusinessException(e);
            return new ResponseEntity<Object>(businessException.getErrorResponse(),
                    Utils.getHttpStatus(e.getErrorCode()));
        } catch (Exception e) {
            BusinessException businessException = new BusinessException(
                    "Error in addOrRemoveCustomer service get call", e);
            return new ResponseEntity<Object>(businessException.getErrorResponse(), HttpStatus.INTERNAL_SERVER_ERROR);
        }
        logger.debug("addOrRemoveCustomer Contoller : addOrRemoveCustomer() end...");
        return new ResponseEntity<Object>(requestData, Utils.getHttpStatus("200"));
    }

在 Rest 控制器中,requestData 为 null 因为已经在拦截器中读取了 requestData(BufferedReader br = request.getReader();),所以现在需要在 Rest 控制器中再次读取请求体数据?

如何达到上述要求?

提前致谢!!!

【问题讨论】:

    标签: spring servlets interceptor servlet-filters


    【解决方案1】:

    一旦将 HttpRequest 作为输入流 (BufferedReader) 读取,此流将关闭。然后,Spring 无法从流请求中提取数据。

    如果您想记录请求数据,请尝试使用 CommonsRequestLoggingFilter。您可以在以下网址查看如何使用此过滤器:https://www.baeldung.com/spring-http-logging

    【讨论】:

    • 感谢您的帮助。限制 ContentCachingRequestWrapper 类仅支持以下内容: 1.Content-Type:application/x-www-form-urlencoded 2.Method-Type:POST 但我正在寻找 Content-Type:application/json
    • 那么,您可以调用 HttpServletRequest 的以下方法来获取参数值、路径等,而不是从请求中获取输入流:getParamterMap、getServletPath、getRequestURI、getRequestURL
    猜你喜欢
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2013-10-25
    • 2018-01-18
    相关资源
    最近更新 更多