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

在到达spring控制器之前,如何修改请求体中从UI端发送的JSON对象?,spring,Spring,在到达spring控制器之前,如何修改请求体中从UI端发送的JSON对象 我尝试添加过滤器,但当我从请求(servletrequest.getReader())读取数据,然后将请求转发到过滤器链中的下一个过滤器时,它就失败了(请求没有到达控制器) 使用这个函数,我得到了字符串中的JSON,但我不知道如何将它放回请求中。使用Spring。您还可以专门选择拦截特定请求。检查。这完全取决于您正在使用的Spring版本。但这应该会让您对如何使用Spring有一个公平的看法 package com.tes

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

我尝试添加过滤器,但当我从请求(servletrequest.getReader())读取数据,然后将请求转发到过滤器链中的下一个过滤器时,它就失败了(请求没有到达控制器)

使用这个函数,我得到了字符串中的JSON,但我不知道如何将它放回请求中。

使用Spring。您还可以专门选择拦截特定请求。检查。这完全取决于您正在使用的Spring版本。但这应该会让您对如何使用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");

}
package com.test.intercept;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Map;
导入javax.servlet.ServletContext;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入org.json.JSONArray;
导入org.json.JSONObject;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.http.HttpStatus;
导入org.springframework.web.method.HandlerMethod;
导入org.springframework.web.servlet.ModelAndView;
导入org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
公共类HttpRequestInterceptor扩展HandlerInterceptor适配器{
@自动连线
私有服务上下文;
@凌驾
公共布尔预处理(HttpServletRequest,
HttpServletResponse,对象处理程序)引发异常{
HandlerMethod HandlerMethod=(HandlerMethod)处理程序;
String methodName=handlerMethod.getMethod().getName();
Map headerMap=HttpUtil.getAllHeaders(请求);
布尔值isAllowed=false;
//做你想做的事来保护你的json
//
允许返回;
}
@凌驾
完成后公共无效(HttpServletRequest arg0,
HttpServletResponse arg1,对象arg2,异常arg3)
抛出异常{
logger.info(“完成后的记录”);
}
@凌驾
public void postHandle(HttpServletRequest arg0、HttpServletResponse arg1、,
对象arg2、ModelAndView arg3)引发异常{
logger.info(“在posthandle中”);
}
并在servletContext.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>


在出现问题的地方添加代码。.如果出现任何错误,请进行堆栈后跟踪。我尝试使用上述代码获取字符串中的JSON。但我无法将修改后的JSON放入请求中,并继续使用客户端的筛选器链。您将如何将JSON发送到服务器?是否有任何JavaScript函数或其他内容?是的,简单的ajax post请求“data:JSON.stringify(XYZ)”。您是在尝试修改单个控制器的JSON还是所有控制器的JSON?为什么?我能够在到达我的过滤器中的控制器之前获取请求参数(尽管这是更好的方法)但我想知道如何从请求中获取JSON并对其进行修改。查看其中的说明,请求正文只能读取一次。因此,我认为修改JSON对您没有用处,因为您无法在下一步访问它。如果绝对需要按您所需的方式传递数据,您可以修改interceptors中的标头。也许您可以使用而不是
<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>