RepeatReadRequestWrapper
package cn.service.web.common.filter; import com.alibaba.fastjson.JSON;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.MediaType;
import org.springframework.mock.web.DelegatingServletInputStream; import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*; /**
* 可以重复读Request
*/
public class RepeatReadRequestWrapper extends HttpServletRequestWrapper {
private static final Logger logger = LoggerFactory.getLogger(RepeatReadRequestWrapper.class);
private final byte[] bytes;
private final Hashtable<String, String[]> parameterMap = new Hashtable<>();
private final ServletInputStream inputStream;
private final BufferedReader reader;
private final Object lock = new Object();
private boolean isRead = false; /**
*
* @param request
* @throws IOException
*/
public RepeatReadRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
bytes = IOUtils.toByteArray(request.getInputStream());
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
inputStream = new DelegatingServletInputStream(bais);
reader = new BufferedReader(new InputStreamReader(bais));
} @Override
public ServletInputStream getInputStream() {
return inputStream;
} @Override
public BufferedReader getReader() {
return reader;
} @Override
public String getParameter(String name) {
String[] values = getParameterMap().get(name);
return values == null || values.length == 0 ? null : values[0];
} @Override
public Map<String, String[]> getParameterMap() {
if(!initParameterMap().isEmpty()){
return parameterMap;
}
return super.getParameterMap();
} @Override
public Enumeration<String> getParameterNames() {
if(!initParameterMap().isEmpty()){
parameterMap.keys();
}
return super.getParameterNames();
} @Override
public String[] getParameterValues(String name) {
return getParameterMap().get(name);
} public Hashtable<String, String[]> initParameterMap(){
if(!isRead){
synchronized (lock){
if(isRead){
logger.info("parameterMap has inited, when you step into synchronized block");
return parameterMap;
}
try {
/*
String text = new String(bytes, getCharacterEncoding());
logger.info("initParameterMap text {}", text);
String body = URLDecoder.decode(text, DEFAULT_CHARSET);
*/
//String body = new String(Base64.getUrlDecoder().decode(bytes), DEFAULT_CHARSET);
String body = new String(bytes, getCharacterEncoding());
if(StringUtils.isNotBlank(body)){
if(getContentType().contains(MediaType.APPLICATION_JSON_VALUE)){
Map<String,Object> map = JSON.parseObject(body,Map.class);
if(map != null && !map.isEmpty()){
map.entrySet().stream().forEach(entry -> {
if(entry.getValue() instanceof JSON){
parameterMap.put(entry.getKey(), new String[]{JSON.toJSONString(entry.getValue())});
} else{
parameterMap.put(entry.getKey(), new String[]{String.valueOf(entry.getValue())});
}
});
}
} else {
HashMap<String, List<String>> param = new HashMap<>();
String[] pairs = body.split("&");
for (String nv : pairs) {
String name = nv.split("=")[0];
String val = nv.split("=")[1];
if (param.containsKey(name)) {
List<String> value = param.get(name);
value.add(val);
param.put(name, value);
} else {
List<String> value = new ArrayList<>();
value.add(val);
param.put(name, value);
}
}
Iterator<Map.Entry<String, List<String>>> iterator = param.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<String, List<String>> next = iterator.next();
parameterMap.put(next.getKey(), next.getValue().toArray(new String[]{}));
}
}
}
String queryString = getQueryString();
if(StringUtils.isNotBlank(queryString)){
String[] pair = queryString.split("&");
for (int i = 0; i < pair.length; i++) {
String[] kv = pair[i].split("=");
if(kv.length>1){
parameterMap.put(kv[0], kv[1].split(","));
}
}
}
} catch (Exception e) {
logger.error("initParameterMap error", e);
} finally {
isRead = true;
}
}
}
return parameterMap;
}
}
package cn.service.web.common.filter; import com.google.common.collect.Lists;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.MediaType; import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.List; /**
* service优雅停机:统计正在处理的http请求
* <p>Created by xxxx on 17/8/02.
*/
public class HttpRequestCounterFilter implements Filter {
private static Logger logger = LoggerFactory.getLogger(HttpRequestCounterFilter.class);
private static final List<MediaType> ignoreRepeatReadList = Lists.newArrayList(
MediaType.APPLICATION_FORM_URLENCODED,
MediaType.MULTIPART_FORM_DATA); @Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.debug("cn.fraudmetrix.octopus.service.web.common.filter.HttpRequestCounterFilter.init");
} @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
ServletRequest httpRequest = request;
HttpServletRequest req = null;
if (request instanceof HttpServletRequest){
req = (HttpServletRequest) request;
LocalRunningHttpRequestCounter.in(req);
if(isRepeatReadRequest(req) && !RequestContextInterceptor.ignoreLoggerURIList.contains(req.getRequestURI())){
httpRequest = new RepeatReadRequestWrapper(req);
}
/*
Map<String, String[]> parameterMap = request.getParameterMap();
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
sb.append(entry.getKey()+":"+ StringUtils.join(entry.getValue(),",")).append("\n");
} String taskId = request.getParameter(ApiParamConstants.TASK_ID);
String partnerCode = httpRequest.getHeader(HeaderConstants.PARAMS_PARTNER_CODE);
String requestURI = httpRequest.getRequestURI();
logger.info("{} HttpServletRequest filter {}\n{}\n{}",taskId, partnerCode, requestURI, sb);
*/
} try {
chain.doFilter(httpRequest, response);
} finally {
if (req != null)
LocalRunningHttpRequestCounter.out(req);
}
} /**
* 是否是支持可重复读的request
* @param request
* @return
*/
private boolean isRepeatReadRequest(HttpServletRequest request) {
return ignoreRepeatReadList.stream().filter(mediaType -> mediaType.includes(MediaType.parseMediaType(request.getContentType()))).count() == 0;
} @Override
public void destroy() {
logger.debug("destroy");
}
}
随机推荐
- src 和 href 的区别?
src:都是引用资源 src:指向外部资源的位置 , 当浏览器解析到此元素时,会暂停其它资源的下载和处理 , 直到将该资源加载 , 编译 , 执行完毕 ,相当于将资源嵌入到文档中当前元素的所在的位置: ...
- 在 Vue 实例中编写生命周期hook 或者其它 option/propertie 时,为什么不适用箭头函数 ?
首先,箭头函数没有自己的 this 环境变量 会沿用作用域使用父级this : 由Vue 管理的函数 ,如果写成箭头函数 this 就不在是 Vue 实例 了 :
- Vue3 的emit3 属性和 props 属性?
使用场景:使用父子组件通信的时候 : 作用: 用来声明组件有哪些自定义事件,不在emtis里面都会当成原生事件,绑定给组件的根标 签. 好处: 不在像 vue2 使用 .native 修饰符 在 v ...
- 蜘点云原生之 KubeSphere 落地实践过程
作者:池晓东,蜘点商业网络服务有限公司技术总监,从事软件开发设计 10 多年,喜欢研究各类新技术,分享技术. 来源:本文由 11 月 25 日广州站 meetup 中讲师池晓东整理,整理于该活动中池老 ...
- 图菱科技 SaaS 系统容器化最佳实践
大家好,我是龚承明,在图菱(成都)科技有限公司任职,主要负责公司的产品系统研发以及公司IT基础设施的建设工作.本篇文章将为大家介绍下我司在采用 KubeSphere 平台实现公司业务系统容器化过程中的 ...
- direasch目录扫描
direasch目录扫描工具 安装: 1.github源码下载解压 使用 git 安装:(推荐git clone https://github.com/maurosoria/dirsearch.git ...
- Syncfusion宣布开源其为.NET MAUI开发的14个控件
.NET MAUI是Xamarin.Forms的进化版,增加了对构建桌面应用的支持..NET MAUI的特点包括统一的框架.对桌面应用的支持.性能改进.使用现代技术以及开源特性.开源 .NET MAU ...
- 使用 FastGPT 实现最佳 AI 翻译工作流:全世界最信达雅的翻译
想让AI翻译既准确又地道?本文将教你如何利用 FastGPT 打造一个革命性的翻译工作流. 它不仅支持文本翻译,还能直接处理文档,更能通过自定义术语表确保专业术语的翻译准确性,堪称翻译神器! 直接看效 ...
- ABC370 E - Avoid K Partition
ABC370 E - Avoid K Partition 求一个序列的合法划分方案数.一种划分合法当且仅当没有一个子串的和是 \(k\). 由于是否存在子串和为 \(k\) 很重要,因此考虑将它加入状 ...
- CF939 D
CF939 D 让你把区间分成 \(k\) 段, 段内用 \(xor\) 连接, 段之间用 \(or\) 连接,问你在结果不大于 \(x\) 的前提下, \(k\) 的最大值 \(1 \leq n \ ...