java多次读取HttpServletRequest方法
java多次读取HttpServletRequest方法
·
java多次读取HttpServletRequest方法
第一步 继承HttpServletRequestWrapper
package com.xxx.common.filter;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
import java.nio.charset.StandardCharsets;
/**
* 继承 HttpServletRequestWrapper
*/
@Slf4j
public class CopyHttpServletRequestWrapper extends HttpServletRequestWrapper {
private final String requestBody;
public CopyHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
requestBody = readRequestBody(request);
}
@Override
public ServletInputStream getInputStream() throws IOException {
final byte[] bytes = requestBody.getBytes(StandardCharsets.UTF_8);
return new ServletInputStream() {
private int currentIndex = 0;
@Override
public int read() throws IOException {
if (currentIndex >= bytes.length) {
return -1;
}
return bytes[currentIndex++];
}
@Override
public boolean isFinished() {
return currentIndex >= bytes.length;
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setReadListener(ReadListener readListener) {
throw new UnsupportedOperationException();
}
};
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream(), StandardCharsets.UTF_8));
}
private String readRequestBody(HttpServletRequest request) {
StringBuilder stringBuilder = new StringBuilder();
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(request.getInputStream(), StandardCharsets.UTF_8))) {
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}
return stringBuilder.toString();
}
}
第二步 实现Filter方法
package com.xxx.common.filter;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* 实现 Filter方法
*/
@Component
public class CopyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
if (servletRequest instanceof HttpServletRequest) {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
final CopyHttpServletRequestWrapper copyHttpServletRequestWrapper = new CopyHttpServletRequestWrapper(httpServletRequest);
filterChain.doFilter(copyHttpServletRequestWrapper, servletResponse);
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
}
第三步 放入配置类
package com.xxx.framework.config;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.DispatcherType;
import com.xxx.common.filter.CopyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
/**
* Filter 配置
*/
@Configuration
public class FilterConfig
{
@Bean
@Order(1)
public FilterRegistrationBean<CopyFilter> copyFilters() {
final FilterRegistrationBean<CopyFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new CopyFilter());
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
}
第四步 实现HandlerInterceptor 拦截器处理
package com.xxx.interceptor.interceptorAdapter;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import java.io.*;
import java.nio.charset.StandardCharsets;
/**
* 初始化验证拦截
*/
@Component
public class InitInterceptor implements HandlerInterceptor {
private Logger logger = LoggerFactory.getLogger(InitInterceptor.class);
/**
* 请求进去controller进行请求拦截
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String requestUrl = request.getRequestURL().toString();
String method = request.getMethod();
String requestUri = request.getRequestURI();
String queryString = request.getQueryString();
logger.info("当前请求完整地址 - {}", requestUrl);
logger.info("当前请求接口地址 - {}", requestUri);
logger.info("当前请求接口方法 - {}", method);
logger.info("当前请求接口地址上传GET参数 - {} ", queryString);
logger.info("当前请求接口地址上传POST参数 - {}", getBodyString(request));
return true;
}
/**
* 请求进入controller后调用
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
/**
* 请求得到响应的时候调用
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
/**
* 获取请求Body
*/
public static String getBodyString(final ServletRequest request) {
StringBuilder sb = new StringBuilder();
InputStream inputStream = null;
BufferedReader reader = null;
try {
inputStream = request.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
String line = "";
while ((line = reader.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)