Commit b934ff6d authored by 唐峰's avatar 唐峰

请求头日志输出

parent 658380d0
package cn.quantgroup.xyqb.config;
import cn.quantgroup.xyqb.util.RequestBodyUtils;
import javax.servlet.ReadListener;
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.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Describe:
* @Created by tangfeng 2023/7/25 07:05
*/
public class CustomHeaderRequestWrapper extends HttpServletRequestWrapper {
private Map<String, String> headers = new HashMap<>();
private String body;
private String requestParam;
public String getBody() {
return body;
}
public String getRequestParam() {
return requestParam;
}
public CustomHeaderRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
//读取输入流的内容转换为String类型IOUtils必须引入org.apache.dubbo.common.utils.IOUtils;包
String body = RequestBodyUtils.read(reader);
this.body = body;
this.requestParam = request.getQueryString();
}
/**
* 增加 http header
* @param name
* @param value
*/
public void addHeader(String name, String value) {
headers.put(name, value);
}
@Override
public String getHeader(String name) {
String value = super.getHeader(name);
//自定义优先
if (headers.containsKey(name)) {
value = headers.get(name);
}
return value;
}
/**
* get the Header names
*/
@Override
public Enumeration<String> getHeaderNames() {
List<String> names = Collections.list(super.getHeaderNames());
for (String name : headers.keySet()) {
names.add(name);
}
return Collections.enumeration(names);
}
@Override
public Enumeration<String> getHeaders(String name) {
List<String> values = Collections.list(super.getHeaders(name));
if (headers.containsKey(name)) {
values = Arrays.asList(headers.get(name));
}
return Collections.enumeration(values);
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(this.getInputStream()));
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream byteArrayIns = new ByteArrayInputStream(body.getBytes());
ServletInputStream servletIns = new ServletInputStream() {
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() throws IOException {
return byteArrayIns.read();
}
};
return servletIns;
}
}
...@@ -9,16 +9,22 @@ import cn.quantgroup.xyqb.remote.StmsRemoteService; ...@@ -9,16 +9,22 @@ import cn.quantgroup.xyqb.remote.StmsRemoteService;
import cn.quantgroup.xyqb.service.session.ISessionService; import cn.quantgroup.xyqb.service.session.ISessionService;
import cn.quantgroup.xyqb.session.XyqbSessionContextHolder; import cn.quantgroup.xyqb.session.XyqbSessionContextHolder;
import cn.quantgroup.xyqb.util.StringUtils; import cn.quantgroup.xyqb.util.StringUtils;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map;
/** /**
* stms权限认证拦截器 * stms权限认证拦截器
*/ */
@Slf4j
public class InnerInterceptor implements HandlerInterceptor { public class InnerInterceptor implements HandlerInterceptor {
private final ISessionService sessionService; private final ISessionService sessionService;
private final StmsRemoteService stmsRemoteService; private final StmsRemoteService stmsRemoteService;
...@@ -30,6 +36,7 @@ public class InnerInterceptor implements HandlerInterceptor { ...@@ -30,6 +36,7 @@ public class InnerInterceptor implements HandlerInterceptor {
@Override @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//所有开放出去的外部接口,都需要验证租户id和注册来源 //所有开放出去的外部接口,都需要验证租户id和注册来源
String tenantId = request.getHeader(Constants.X_AUTH_TENANT); String tenantId = request.getHeader(Constants.X_AUTH_TENANT);
String registeredFrom = request.getHeader(Constants.X_AUTH_FROM); String registeredFrom = request.getHeader(Constants.X_AUTH_FROM);
......
package cn.quantgroup.xyqb.filter; package cn.quantgroup.xyqb.filter;
import cn.quantgroup.xyqb.config.CustomHeaderRequestWrapper;
import cn.quantgroup.xyqb.model.JsonResult; import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.model.session.SessionStruct; import cn.quantgroup.xyqb.model.session.SessionStruct;
import cn.quantgroup.xyqb.service.session.ISessionService; import cn.quantgroup.xyqb.service.session.ISessionService;
import cn.quantgroup.xyqb.session.XyqbSessionContextHolder; import cn.quantgroup.xyqb.session.XyqbSessionContextHolder;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpStatus; import org.apache.http.HttpStatus;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -16,12 +19,15 @@ import javax.servlet.http.HttpServletRequest; ...@@ -16,12 +19,15 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
/** /**
* Created by 11 on 2016/12/29. * Created by 11 on 2016/12/29.
*/ */
@Component @Component
@Slf4j
public class RequestFilter implements Filter { public class RequestFilter implements Filter {
/** /**
...@@ -44,12 +50,14 @@ public class RequestFilter implements Filter { ...@@ -44,12 +50,14 @@ public class RequestFilter implements Filter {
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse; HttpServletResponse response = (HttpServletResponse) servletResponse;
printReqLog(request);
// 带状态接口 // 带状态接口
if (isMatch(request)) { if (isMatch(request)) {
// 需获取session信息 // 需获取session信息
SessionStruct sessionStruct = XyqbSessionContextHolder.getXSessionFromRedis(); SessionStruct sessionStruct = XyqbSessionContextHolder.getXSessionFromRedis();
if (Objects.isNull(sessionStruct)) { if (Objects.isNull(sessionStruct)) {
/* 如果没有获取到session信息则返回错误信息 */ /* 如果没有获取到session信息则返回错误信息 */
response.setStatus(HttpStatus.SC_UNAUTHORIZED); response.setStatus(HttpStatus.SC_UNAUTHORIZED);
response.setHeader("Content-Type", "application/json;charset=utf-8"); response.setHeader("Content-Type", "application/json;charset=utf-8");
PrintWriter writer = response.getWriter(); PrintWriter writer = response.getWriter();
...@@ -57,9 +65,9 @@ public class RequestFilter implements Filter { ...@@ -57,9 +65,9 @@ public class RequestFilter implements Filter {
writer.close(); writer.close();
return; return;
} else { } else {
/* 延续session生命期 */ /* 延续session生命期 */
try { try {
sessionService.persistSession(sessionStruct.getSid(), sessionStruct.getValues(),sessionStruct.getTenantId()); sessionService.persistSession(sessionStruct.getSid(), sessionStruct.getValues(), sessionStruct.getTenantId());
} finally { } finally {
XyqbSessionContextHolder.releaseSession(); XyqbSessionContextHolder.releaseSession();
} }
...@@ -96,4 +104,37 @@ public class RequestFilter implements Filter { ...@@ -96,4 +104,37 @@ public class RequestFilter implements Filter {
public void destroy() { public void destroy() {
} }
private void printReqLog(HttpServletRequest request) {
try {
Map<String, String> headerMap = processHeader(request);
String url = request.getRequestURL().toString();
Map<String, String> requestParamMap = Maps.newHashMap();
CustomHeaderRequestWrapper requestWrapper = new CustomHeaderRequestWrapper(request);
requestParamMap.put("请求参数", requestWrapper.getRequestParam());
requestParamMap.put("请求体", requestWrapper.getBody());
log.info("调用接口开始:URL:{},请求头:{},请求参数:{},HTTP Method:{}",
url,
JSONObject.toJSONString(headerMap),
JSONObject.toJSONString(requestParamMap), requestWrapper.getMethod()
);
} catch (IOException e) {
log.error("printReqLog error:{}", e.getMessage(), e);
}
}
private Map<String, String> processHeader(HttpServletRequest req) {
Map<String, String> map = Maps.newHashMap();
Enumeration<String> headerNames = req.getHeaderNames();
while (headerNames.hasMoreElements()) {
String s = headerNames.nextElement();
if (org.apache.commons.lang3.StringUtils.isNotEmpty(s)) {
map.put(s, req.getHeader(s));
}
}
return map;
}
} }
package cn.quantgroup.xyqb.util;
import java.io.IOException;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
/**
* @Describe:
* @Created by tangfeng 2022/7/12 08:20
*/
public class RequestBodyUtils {
private static final int BUFFER_SIZE = 1024 * 8;
/**
* read string.
*
* @param reader Reader instance.
* @return String.
* @throws IOException
*/
public static String read(Reader reader) throws IOException {
StringWriter writer = new StringWriter();
try {
write(reader, writer);
return writer.getBuffer().toString();
} finally {
writer.close();
}
}
/**
* write.
*
* @param reader Reader.
* @param writer Writer.
* @return count.
* @throws IOException
*/
public static long write(Reader reader, Writer writer) throws IOException {
return write(reader, writer, BUFFER_SIZE);
}
/**
* write.
*
* @param reader Reader.
* @param writer Writer.
* @param bufferSize buffer size.
* @return count.
* @throws IOException
*/
public static long write(Reader reader, Writer writer, int bufferSize) throws IOException {
int read;
long total = 0;
char[] buf = new char[BUFFER_SIZE];
while ((read = reader.read(buf)) != -1) {
writer.write(buf, 0, read);
total += read;
}
return total;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment