SpringBoot 过滤器Filter的使用

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

可通过过滤器,对请求进行拦截,比如读取session判断用户是否登录、判断访问的请求URL是否有访问权限(黑白名单)等。主要还是可对请求进行预处理。
过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。

打印日志

不要过滤资源文件下的静态页面,否则一直重定向到登录会出现死循环,界面无法正常跳转。

@Component
@WebFilter(filterName = "urlFilter", urlPatterns = "/*")
public class UrlFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {   }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
    {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String requestURI = request.getRequestURI();
        if(requestURI.equals("")|| requestURI.equals("/")|| !requestURI.contains("/wxtRent"))
        {
            response.sendRedirect("/wxtRent/login.html");
            return;
        }
        if ("GET".equals(request.getMethod())) {
            if (request.getQueryString() != null) {
                url.append("?").append(request.getQueryString());
            }
        }
        if (request.getContentType().equalsIgnoreCase(MediaType.APPLICATION_FORM_URLENCODED_VALUE)) {
            Map<String, String[]> formData = request.getParameterMap();
            ArrayList<Map<String, String>> headerList = new ArrayList<>();
            HashMap<String, String> headerMaps = new HashMap<>();
            for (Enumeration<String> e = request.getHeaderNames(); e.hasMoreElements(); ) {
                String name = e.nextElement();
                headerMaps.put(name, request.getHeader(name));
            }
            headerList.add(headerMaps);
            log.info("--> " + request.getMethod() + " " + url.toString() + "\n" + JSON.toJSONString(formData) + "\n" + headerList);
        }
        //打印JSON数据
        if (request.getContentType().equalsIgnoreCase(MediaType.APPLICATION_JSON_VALUE)) {
            MyRequestWrapper myRequestWrapper = null;
            try {
                myRequestWrapper = new MyRequestWrapper(request);
            } catch (Exception e) {
                log.error(e.getMessage());
            }
            filterChain.doFilter(myRequestWrapper, response);
            return;
        }
        filterChain.doFilter(request, response);
    }

    @Override
    public void destroy(){ }
}

MyRequestWrapper

public class MyRequestWrapper extends HttpServletRequestWrapper {

	private byte[] body;

	public MyRequestWrapper(HttpServletRequest httpServletRequest) {
		super(httpServletRequest);
		String requestData = getBodyString(httpServletRequest);
		this.body = requestData.getBytes(StandardCharsets.UTF_8);
		log.info("--> " + httpServletRequest.getMethod() + " " + httpServletRequest.getRequestURL() + "\n" + requestData);
	}

	/**
	 * 获取请求Body
	 *
	 * @param request
	 * @return
	 */
	public String getBodyString(final ServletRequest request){
		StringBuilder sb = new StringBuilder();
		InputStream inputStream = null;
		BufferedReader reader = null;
		try {
			inputStream = cloneInputStream(request.getInputStream());
			reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
			String line = "";
			while ((line = reader.readLine()) != null){
				sb.append(line);
			}
		}catch (Exception e){
			log.error(e.getMessage());
		}finally {
			if(inputStream != null){
				try {
					inputStream.close();
				}catch (Exception ignored){}
			}
			if(reader != null){
				try {
					reader.close();
				}catch (Exception ignored){}
			}
		}
		return sb.toString();
	}

	/**
	 * Description: 复制输入流
	 *
	 * @param inputStream
	 * @return
	 */
	public InputStream cloneInputStream(ServletInputStream inputStream){
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
		byte[] b = new byte[1024];
		int len;
		try {
			while ((len = inputStream.read(b)) > -1){
				byteArrayOutputStream.write(b, 0, len);
			}
			byteArrayOutputStream.flush();
		}catch (Exception e){
			log.error(e.getMessage());
		}
		return new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
	}

	@Override
	public BufferedReader getReader() throws IOException{
		return new BufferedReader(new InputStreamReader(getInputStream()));
	}
	@Override
	public ServletInputStream getInputStream() throws IOException{
		final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body);

		return 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 byteArrayInputStream.read(); }
		};
	}
}
跨域处理

https://blog.csdn.net/qq_19636353/article/details/126302533

参考资料

Spring Boot实战:拦截器与过滤器
https://www.cnblogs.com/paddix/p/8365558.html

springboot 日志打印完整json格式的请求参数
https://blog.csdn.net/mefly521/article/details/106922091/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值