HTTP - Get / Post 请求中,URL & FORM 参数如何分别获取?
发布日期:2021-06-30 23:28:39 浏览次数:2 分类:技术文章

本文共 4477 字,大约阅读时间需要 14 分钟。

我们都知道在 HttpServletRequest 中,URL 和 FORM 参数共存时,都会出现在 getParameterMap() 方法中,由于一些业务需要区分这两者,笔者研究了下它的类,其实也可以找到各自的区分的办法,如下。

package com.chinadaas.platform.servicecenter.mycommon.handler; import com.alibaba.fastjson.JSON;import com.google.common.collect.Maps;import lombok.Getter;import lombok.Setter;import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;import javax.servlet.ReadListener;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import javax.servlet.http.Part;import java.io.*;import java.nio.charset.Charset;import java.util.Collection;import java.util.Map;import java.util.Objects; @Getter@Setterpublic class RequestHandler extends HttpServletRequestWrapper {     private String rawJson;     private String form;     private String query;     public static RequestHandler getInstance(HttpServletRequest request) {        if (request instanceof StandardMultipartHttpServletRequest) {            request = ((StandardMultipartHttpServletRequest) request).getRequest();        }        return (RequestHandler)request;    }     public RequestHandler(HttpServletRequest request) throws IOException {        super(request);        StringBuilder sb = new StringBuilder();        InputStream ins = request.getInputStream();        BufferedReader isr = null;        try{            // rawJson case            if(ins != null){                isr = new BufferedReader(new InputStreamReader(ins, Charset.defaultCharset()));                char[] charBuffer = new char[128];                int readCount;                while((readCount = isr.read(charBuffer)) != -1){                    sb.append(charBuffer,0,readCount);                }                setRawJson(sb.toString());            }             // check getParameterMap            Map
tParamMap = request.getParameterMap(); if (!(Objects.nonNull(tParamMap) && tParamMap.size() > 0)) { return; } Map
paramMap = Maps.newHashMap(); tParamMap.entrySet().forEach(param -> { /* Array T String */ String[] valArr = param.getValue(); StringBuilder sbVal = new StringBuilder(); for (String val : valArr) { sbVal.append(val).append(","); } // clean last "," String val = sbVal.substring(0, sbVal.length()-1); paramMap.put(param.getKey(), val); }); // form case // business try catch try { Collection
parts = request.getParts(); Map
form = Maps.newHashMap(); parts.forEach(part -> { String paramKey = part.getName(); String paramVal = paramMap.get(paramKey); paramMap.remove(paramKey); form.put(paramKey, paramVal); }); setForm(JSON.toJSONString(form)); } catch (Exception e) { e.printStackTrace(); // no form-data } // query case setQuery(JSON.toJSONString(paramMap)); System.out.println(1); } finally { if(isr != null) { isr.close(); } } } @Override public ServletInputStream getInputStream() { try { final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(rawJson.getBytes(Charset.defaultCharset())); return new ServletInputStream() { @Override public int read() { return byteArrayInputStream.read(); } @Override public boolean isFinished() { return false; } @Override public boolean isReady() { return false; } @Override public void setReadListener(ReadListener listener) { } }; }catch (Exception e){ e.printStackTrace(); return null; } } @Override public BufferedReader getReader() { return new BufferedReader(new InputStreamReader(this.getInputStream())); }}
  • 这里就分别获取到 URL、FORM、RAW-JSON 参数。
  • 补充:也有专门获取 URL 参数的方法,request.getQueryString()。

转载地址:https://lux-sun.blog.csdn.net/article/details/107366460 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Win系统 - 内存稳定性测试软件(MemTest)
下一篇:SpringBoot - HttpServletRequest 请求重复读取解决方案

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月21日 11时22分38秒