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");
}
}

随机推荐

  1. webpack与grunt、gulp的不同

    首先,它们的共同点三者都是前端构建工具,grunt和gulp早期比较流行,现在 webpack 是主流: 区别:grunt 和 gulp 基于 任务和流 : webpack 基于入口文件,webpac ...

  2. 浅析Jvm

    浅析Jvm 基本概念 引言 Java 虚拟机(JVM,Java Virtual Machine)是 Java 生态系统的核心组成部分,它为 Java 应用程序提供了一个运行环境.JVM 的主要职责是将 ...

  3. KubeSphere 社区双周报|07.05-07.18

    KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...

  4. Nuxt.js 应用中的 app:templatesGenerated 事件钩子详解

    title: Nuxt.js 应用中的 app:templatesGenerated 事件钩子详解 date: 2024/10/19 updated: 2024/10/19 author: cmdra ...

  5. HTML 中 script 标签的属性和加载顺序

    script 标签默认是阻塞加载的,也就是先下载src内容,然后执行src内容,然后再往后读文档 head 中的 script 按顺序加载执行,然后再加载 body 的元素. 把 script 移动到 ...

  6. 学习JavaScript第四天

    文章目录 1 回顾 内置对象 2 内置对象 2.1 Function 2.2 Global 3 DOM 部分知识点介绍 4 BOM 4.1 window ① 弹框 ② 打开关闭窗口 ③ 页面滚动 ④ ...

  7. Python实现微博舆情分析的设计与实现

    引言 随着互联网的发展,社交媒体平台如微博已经成为公众表达意见.分享信息的重要渠道.微博舆情分析旨在通过大数据技术和自然语言处理技术,对微博上的海量信息进行情感分析.热点挖掘和趋势预测,为政府.企业和 ...

  8. 3D数学基础:图形和游戏开发(第二版)--读书笔记(1)

    简介: 本书是关于3D数学.三维空间的几何和代数的入门教材.它旨在告诉你如何使用数学描述三维中的物体及其位置.方向和轨迹.这不是一本关于计算机图形学.模拟,甚至计算几何的书,但是,如果读者打算研究这些 ...

  9. 基于Java+SpringBoot+Mysql实现的古诗词平台功能设计与实现十

    一.前言介绍: 1.1 项目摘要 随着信息技术的迅猛发展和数字化时代的到来,传统文化与现代科技的融合已成为一种趋势.古诗词作为中华民族的文化瑰宝,具有深厚的历史底蕴和独特的艺术魅力.然而,在现代社会中 ...

  10. jquery datatable 全选,反选 参考文档

    1 版本号 DataTables 1.10.12 2 API文档地址 http://datatables.club/reference/option/ 官方option http://datatabl ...