当前位置: 首页 > 知识库问答 >
问题:

在到达spring控制器之前,如何从UI端修改请求体中发送的JSON对象?

曹嘉许
2023-03-14

在到达spring控制器之前,如何从UI端修改请求体中发送的JSON对象?

我尝试添加过滤器,但是一旦我从请求(servletrequest.getReader())读取,然后将请求转发到过滤器链中的下一个过滤器,它就会失败(请求无法到达控制器)。

BufferedReader reader = servletrequest.getReader();
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line);
String data = buffer.toString();

使用这个,我得到了字符串中的JSON,但我无法弄清楚如何将其放回请求中。

共有1个答案

方心思
2023-03-14

使用Spring的HandlerInterceptor。您还可以专门选择拦截特定请求。检查本教程。这取决于您使用的Spring版本。但这应该给你一个公平的视角来看待如何去做。

package com.test.intercept;


import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.JSONArray;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;



public class HttpRequestInterceptor extends HandlerInterceptorAdapter {


@Autowired
private ServletContext context;

@Override
public boolean preHandle(HttpServletRequest request,
        HttpServletResponse response, Object handler) throws Exception {
    HandlerMethod handlerMethod = (HandlerMethod) handler;
    String methodName = handlerMethod.getMethod().getName();
    Map<String, String> headerMap = HttpUtil.getAllHeaders(request);
    Boolean isAllowed=false;

    //doing what you want to your json
    //
    return isAllowed;
}

@Override
public void afterCompletion(HttpServletRequest arg0,
        HttpServletResponse arg1, Object arg2, Exception arg3)
        throws Exception {
    logger.info("in after completion");

}

@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
        Object arg2, ModelAndView arg3) throws Exception {
    logger.info("in posthandle");

}

并在您的 servlet上下文中.xml添加:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/api/**" /> <!--to exclude a path -->
        <mvc:exclude-mapping path="/web/**" /> <!--to exclude a path -->
        <beans:bean class="com.test.interceptor.HttpRequestInterceptor"></beans:bean>
    </mvc:interceptor>
</mvc:interceptors>
 类似资料:
  • 我有一个spring boot应用程序。我更改每个post请求的请求正文。是否可以在请求到达控制器之前修改请求正文。请附上一个例子。

  • 问题内容: 我已经使用像这样的控制器构建了json REST服务: 它工作正常,但现在我需要修改所有响应,并向所有响应添加“状态”和“消息”字段。我已经阅读了一些解决方案: 从某个特定类的所有控制器方法对象返回,例如RestResponse,它将包含“ status”和“ message”字段(但这不是通用解决方案,因为我将不得不修改所有控制器并以新样式编写新控制器) 截取具有方面的所有控制器方法

  • 我用这样的控制器构建了一个json REST服务: 它工作得很好,但是现在我需要修改所有的响应,并为它们添加“状态”和“消息”字段。我读过一些解决方案: 从所有控制器方法返回某个特定类的对象,例如RestResponse,它将包含“状态”和“消息”字段(但这不是通用解决方案,因为我必须修改所有控制器并以新样式编写新控制器) 拦截所有带有方面的控制器方法(但在这种情况下,我无法更改返回类型) 如果我

  • 我正在使用Java和Spring构建一个RESTAPI,我需要在我的控制器中处理一个POST请求,但我需要从该请求中提取主体,它是一个JSON,也是该请求的“来源”, 我有几个问题:首先是如何获取该请求的来源(我猜是在标题中移动的url?),是否有与@RequestBody类似的注释?。 我的第二个问题是,在这种post方法中,通常应该返回什么对象作为响应。

  • 我有一个使用Spring MVC 3.1.3的应用程序和使用Dojo1.4开发的UI。应用程序只有很少的控制器处理通过上传的二进制文件。控制器发送一个json响应,该响应必须用 我实现了web.xml中定义的自定义筛选器: 提前道谢。 更新:我禁用了Spring Security性,并用普通spring mvc进行了测试,但问题仍然存在。我修改了标题和问题描述。

  • 我正在开发我的第一个基于spring的项目样本。下面是我的dispatcher-servlet.xml的摘录。 我尝试向以下url发布帖子,但它似乎从未到达相应的控制器类: 网址: post<code>{“testID”:“1”} 就是回应。 为什么我得到400错误,尽管一切似乎都在地方?