package com.ruoyi.auth.fliter;
|
|
import lombok.extern.log4j.Log4j2;
|
import org.apache.commons.lang3.exception.ExceptionUtils;
|
|
import javax.servlet.ReadListener;
|
import javax.servlet.ServletInputStream;
|
import javax.servlet.ServletRequest;
|
import javax.servlet.ServletResponse;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequestWrapper;
|
import java.io.*;
|
import java.nio.charset.Charset;
|
|
/**
|
* 构建可重复读取inputStream的request
|
*
|
* @author linzhang
|
*/
|
@Log4j2
|
public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper
|
{
|
private final byte[] body;
|
|
public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException
|
{
|
super(request);
|
request.setCharacterEncoding("UTF-8");
|
response.setCharacterEncoding("UTF-8");
|
|
body = getBodyString(request).getBytes("UTF-8");
|
}
|
|
public static String getBodyString(ServletRequest request)
|
{
|
StringBuilder sb = new StringBuilder();
|
BufferedReader reader = null;
|
try (InputStream inputStream = request.getInputStream())
|
{
|
reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));
|
String line = "";
|
while ((line = reader.readLine()) != null)
|
{
|
sb.append(line);
|
}
|
}
|
catch (IOException e)
|
{
|
log.warn("getBodyString出现问题!");
|
}
|
finally
|
{
|
if (reader != null)
|
{
|
try
|
{
|
reader.close();
|
}
|
catch (IOException e)
|
{
|
log.error(ExceptionUtils.getMessage(e));
|
}
|
}
|
}
|
return sb.toString();
|
}
|
|
@Override
|
public BufferedReader getReader() throws IOException
|
{
|
return new BufferedReader(new InputStreamReader(getInputStream()));
|
}
|
|
@Override
|
public ServletInputStream getInputStream() throws IOException
|
{
|
final ByteArrayInputStream bais = new ByteArrayInputStream(body);
|
return new ServletInputStream()
|
{
|
@Override
|
public int read() throws IOException
|
{
|
return bais.read();
|
}
|
|
@Override
|
public int available() throws IOException
|
{
|
return body.length;
|
}
|
|
@Override
|
public boolean isFinished()
|
{
|
return false;
|
}
|
|
@Override
|
public boolean isReady()
|
{
|
return false;
|
}
|
|
@Override
|
public void setReadListener(ReadListener readListener)
|
{
|
|
}
|
};
|
}
|
}
|