我们都知道在 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
@Setter
public 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<String, String[]> tParamMap = request.getParameterMap();
if (!(Objects.nonNull(tParamMap) && tParamMap.size() > 0)) {
return;
}
Map<String, String> 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<Part> parts = request.getParts();
Map<String, String> 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()。