Springboot Filter 多过滤器的使用,成功收获美团,小米offer

为什么要写一个这样的东西?

简单讲讲:

@RequestBody 这个注解大家并不陌生,post请求里,规定参数传递使用application/json 流数据传递(序列化后的json字符串)。

正因为这个请求体重的流数据,流数据只能读取一次。

而我们这次实践案例中,过滤器读取一次,接口还需要读取一次, 如果不整点手法,那么这个流数据明显不够用。

因此, 我们采取了 继承HttpServletRequestWrapper ,创建 BodyReaderHttpServletRequestWrapper 来

将流数据进行复制存储起来。当无论第一次第二次需要使用到流数据时 ,都去当前存储起来的body数据里去读取。

上代码,新建 BodyReaderHttpServletRequestWrapper.java  :

import org.apache.commons.lang3.StringUtils;

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.nio.charset.StandardCharsets;

import java.util.Enumeration;

import java.util.Map;

import java.util.Vector;

/**

  • @Author : JCccc

  • @CreateTime : 2020/3/27

  • @Description :

**/

public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {

private final byte[] body;

/**

  • 所有参数的集合

*/

private Map<String, String[]> parameterMap;

public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {

super(request);

BufferedReader reader = request.getReader();

body = readBytes(reader);

parameterMap = request.getParameterMap();

}

@Override

public BufferedReader getReader() throws IOException {

ServletInputStream inputStream = getInputStream();

if (null == inputStream) {

return null;

}

return new BufferedReader(new InputStreamReader(inputStream));

}

@Override

public Enumeration getParameterNames() {

Vector vector = new Vector<>(parameterMap.keySet());

return vector.elements();

}

@Override

public ServletInputStream getInputStream() throws IOException {

if (body == null) {

return null;

}

final ByteArrayInputStream bais = new ByteArrayInputStream(body);

return new ServletInputStream() {

@Override

public boolean isFinished() {

return false;

}

@Override

public boolean isReady() {

return false;

}

@Override

public void setReadListener(ReadListener listener) {

}

@Override

public int read() throws IOException {

return bais.read();

}

};

}

/**

  • 通过BufferedReader和字符编码集转换成byte数组

  • @param br

  • @return

  • @throws IOException

*/

private byte[] readBytes(BufferedReader br) throws IOException {

String str;

StringBuilder retStr = new StringBuilder();

while ((str = br.readLine()) != null) {

retStr.append(str);

}

if (StringUtils.isNotBlank(retStr.toString())) {

return retStr.toString().getBytes(StandardCharsets.UTF_8);

}

return null;

}

}

接着,自定义 第一个过滤器 , CheckUserFilter.java:

import javax.servlet.*;

import javax.servlet.http.HttpServletRequest;

import java.io.BufferedReader;

import java.io.IOException;

/**

  • @Author : JCccc

  • @CreateTime : 2020/3/27

  • @Description :

**/

public class CheckUserFilter implements Filter {

@Override

public void init(FilterConfig filterConfig) {

System.out.println(“过滤器一初始化”);

}

@Override

public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException {

System.out.println(“进入到第一个过滤器,执行相关逻辑处理”);

HttpServletRequest request = (HttpServletRequest) req;

String path = request.getRequestURI();

String method = request.getMethod();

System.out.println(method);

//排除一些url的拦截

if (path.equals(“/test/testContext”)) {

filterChain.doFilter(request, res);

}

if (“POST”.equals(method)) {

BodyReaderHttpServletRequestWrapper requestWrapper = new BodyReaderHttpServletRequestWrapper(request);

// 从Request的包装类中读取数据

BufferedReader reader = requestWrapper.getReader();

StringBuilder sb = new StringBuilder();

String line;

while ((line = reader.readLine()) != null) {

sb.append(line);

}

reader.close();

System.out.println(sb.toString());

filterChain.doFilter(requestWrapper, res);

}

}

@Override

public void destroy() {

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后,附一张自己面试前准备的脑图:

image

面试前一定少不了刷题,为了方便大家复习,我分享一波个人整理的面试大全宝典

  • Java核心知识整理

image

  • Spring全家桶(实战系列)

image.png

Step3:刷题

既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

以下是我私藏的面试题库:

image

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。

最后祝愿各位身体健康,顺利拿到心仪的offer!

kWQZ-1711082733219)]

  • Spring全家桶(实战系列)

[外链图片转存中…(img-sl92dg4u-1711082733219)]

Step3:刷题

既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

以下是我私藏的面试题库:

[外链图片转存中…(img-DGwaYx8a-1711082733220)]

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。

最后祝愿各位身体健康,顺利拿到心仪的offer!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 30
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值