java自定义request对象,修改请求方式

修改post请求参数的请参照我的https://blog.csdn.net/qq_34468174/article/details/106665093,两者进行整合也许可以实现你需要的功能,比如根据不同请求方式、请求头分别采用不同逻辑处理请求参数!

1.场景:将前端请求的post请求全部改为 application/json的请求方式,因为有后端项目使用的是@RequestBody注解,作为中间件,需要将(其他服务)转发过来的请求更改为 application/json,控制层正常接收。

2.实现过程:研究request请求源码得出

3.实现代码

自定义request对象:


/**
 * bodyReader包装request,对宝物基座的数据进行处理,宝物基座不支持json,若需要只需要简单实现即可
 *
 * @author qiaofeng
 */
@Slf4j
public class BodyHttpServletRequestWrapper extends HttpServletRequestWrapper {


    private final String contentType = "application/json";

    private Map<String, String> headerMap = new HashMap<>();

    @Nullable
    private ServletInputStream body;

    public BodyHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
        setHeaderMap(request);
//此处可以对数据做任何修改后,再放入到body
        String dataInfo = request.getParameter("data");
        if (StringUtils.isEmpty(dataInfo)) {
            return;
        }
        ByteArrayInputStream delegate = new ByteArrayInputStream(dataInfo.getBytes(StandardCharsets.UTF_8));
        body = new ServletInputStream() {
            @Override
            public int read() {
                return delegate.read();
            }

            @Override
            public boolean isFinished() {
                return false;
            }

            @Override
            public boolean isReady() {
                return false;
            }

            @Override
            public void setReadListener(ReadListener listener) {
                throw new UnsupportedOperationException();
            }
        };
    }

    @Override
    public ServletInputStream getInputStream() {
        return body;
    }

    /**
     * add a header with given name and value
     */
    private void addHeader(String name, String value) {
        headerMap.put(name, value);
    }

    @Override
    public String getHeader(String name) {
        String headerValue = super.getHeader(name);
        if (headerMap.containsKey(name)) {
            headerValue = headerMap.get(name);
        }
        return headerValue;
    }

    /**
     * get the Header names
     */
    @Override
    public Enumeration<String> getHeaderNames() {
        List<String> names = Collections.list(super.getHeaderNames());
        names.addAll(headerMap.keySet());
        return Collections.enumeration(names);
    }

    @Override
    public Enumeration<String> getHeaders(String name) {
        List<String> values = Collections.list(super.getHeaders(name));
        if (headerMap.containsKey(name)) {
            values = Collections.singletonList(headerMap.get(name));
        }
        return Collections.enumeration(values);

    }

    private void setHeaderMap(HttpServletRequest request) {
        Enumeration e = request.getHeaderNames();
        while (e.hasMoreElements()) {
            String name = (String) e.nextElement();
            String value = request.getHeader(name);
            addHeader(name, value);
        }
        addHeader("content-type", contentType);
    }

    public String getContentType(){
        return contentType;
    }

拦截器


/**
 * HttpServletRequest替换的filter
 *
 * @author qiaofeng
 */
@Component
@Slf4j
public class HttpServletRequestReplacedFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        //判断宝物基座的逻辑
        String methodType = request.getMethod().toUpperCase();
        System.out.println("请求方式为:" + methodType);
        if ((("POST".equals(methodType)) || ("DELETE".equals(methodType)) || ("PUT".equals(methodType))) && isBaoWuTransmit(request)) {
            ServletRequest requestWrapper = new BodyHttpServletRequestWrapper(request);
            filterChain.doFilter(requestWrapper, response);
        } else{
            filterChain.doFilter(request, response);
        }
    }

    private boolean isBaoWuTransmit(HttpServletRequest request) {
        boolean baoWu = false;
        Enumeration e = request.getHeaderNames();
        while (e.hasMoreElements()) {
            String headerName = (String) e.nextElement();
            if ("appcode".equals(headerName)){
                baoWu = true;
            }
        }
        return baoWu;
    }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值