1.编写 ParameterRequestWrapper 包装类
拦截器传它就可以了
/**
*
* @author guokaige
* @date: 2019年1月15日 下午2:47:24
*/
public class ParameterRequestWrapper extends HttpServletRequestWrapper {
private Map<String, String[]> params = new HashMap<String, String[]>();
public ParameterRequestWrapper(HttpServletRequest request) {
// 将request交给父类,以便于调用对应方法的时候,将其输出,其实父亲类的实现方式和第一种new的方式类似
super(request);
// 将参数表,赋予给当前的Map以便于持有request中的参数
this.params.putAll(request.getParameterMap());
}
public ParameterRequestWrapper(HttpServletRequest request, Map<String, Object> extendParams) {
this(request);
addAllParameters(extendParams);
}
@Override
public String getParameter(String name) {
String[] values = params.get(name);
if (values == null || values.length == 0) {
return null;
}
return values[0];
}
@Override
public String[] getParameterValues(String name) {
return params.get(name);
}
public void addAllParameters(Map<String, Object> otherParams) {
for (Map.Entry<String, Object> entry : otherParams.entrySet()) {
addParameter(entry.getKey(), entry.getValue());
}
}
public void addParameter(String name, Object value) {
if (value != null) {
if (value instanceof String[]) {
params.put(name, (String[]) value);
} else if (value instanceof String) {
params.put(name, new String[] { (String) value });
} else {
params.put(name, new String[] { String.valueOf(value) });
}
}
}
}
2. 拦截器修改参数
/**
*
* @author guokaige
* @date: 2018年10月31日 下午5:22:29
*/
@Component("parametersFilter")
public class ParametersFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
try {
System.out.println("--------------------------BizExceptionFilter-----"+request.getParameter("password"));
String password = request.getParameter("password");
if(Strings.hasText(password)) {
ParameterRequestWrapper requestWrapper = new ParameterRequestWrapper((HttpServletRequest)request);
requestWrapper.addParameter("password" , "123456");
System.out.println("--------------------------BizExceptionFilter-----"+requestWrapper.getParameter("password"));
filterChain.doFilter(requestWrapper, response);
}else {
filterChain.doFilter(request, response);
}
} catch (Exception ex) {
throw ex;
}
}
}
3. ResponseWrapper
/**
*
* @author guokaige
* @date: 2019年1月21日 上午9:28:36
*/
public class ResponseWrapper extends HttpServletResponseWrapper {
private ByteArrayOutputStream bytes = new ByteArrayOutputStream();
@SuppressWarnings("unused")
private HttpServletResponse response;
private PrintWriter pwrite;
public ResponseWrapper(HttpServletResponse response) {
super(response);
this.response = response;
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new MyServletOutputStream(bytes); // 将数据写到 byte 中
}
/**
* 重写父类的 getWriter() 方法,将响应数据缓存在 PrintWriter 中
*/
@Override
public PrintWriter getWriter() throws IOException {
try{
pwrite = new PrintWriter(new OutputStreamWriter(bytes, "utf-8"));
} catch(UnsupportedEncodingException e) {
e.printStackTrace();
}
return pwrite;
}
/**
* 获取缓存在 PrintWriter 中的响应数据
* @return
*/
public byte[] getBytes() {
if(null != pwrite) {
pwrite.close();
return bytes.toByteArray();
}
if(null != bytes) {
try {
bytes.flush();
} catch(IOException e) {
e.printStackTrace();
}
}
return bytes.toByteArray();
}
class MyServletOutputStream extends ServletOutputStream {
private ByteArrayOutputStream ostream ;
public MyServletOutputStream(ByteArrayOutputStream ostream) {
this.ostream = ostream;
}
@Override
public void write(int b) throws IOException {
ostream.write(b); // 将数据写到 stream 中
}
@Override
public boolean isReady() {
// TODO Auto-generated method stub
return false;
}
@Override
public void setWriteListener(WriteListener listener) {
// TODO Auto-generated method stub
}
}
}
4. 获取之后写回
/**
*
* @author guokaige
* @date: 2018年10月31日 下午5:22:29
*/
@Component("oAuth2AccessTokenFilter")
public class OAuth2AccessTokenFilter extends OncePerRequestFilter {
private static final String OAUTH_TOKEN_URL = "/oauth/token";
@Autowired
DefaultTokenServices tokenServices;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
try {
String uri = request.getRequestURI();
if (uri.contains(OAUTH_TOKEN_URL)) {
ResponseWrapper responseWrapper = new ResponseWrapper(response);
filterChain.doFilter(request, responseWrapper);
byte[] responseBody = responseWrapper.getBytes();
String body = new String(responseBody, Charset.forName("utf-8"));
//tokenServices.readAccessToken("");
System.out.println("---------------------------" + body);
responseWrapper.getResponse().getOutputStream().write(responseBody);
} else {
filterChain.doFilter(request, response);
}
} catch (Exception ex) {
request.setAttribute("errorMsg", "操作失败,请重试");
RequestDispatcher dispatcher = request.getRequestDispatcher("/login");
dispatcher.forward(request, response);
}
}
}