SpringBoot项目拦截器获取Post方法的请求body实现

网友投稿 1309 2022-11-03

SpringBoot项目-获取Post方法的请求body实现

SpringBoot项目-获取Post方法的请求body实现

1). 存在问题流只能读取一次

2). 目标多次读取流

3). 解决方法创建包装类

4). RequestWrapper

package com.mazaiting.redeye.wrapper;

import com.mazaiting.redeye.utils.StreamUtil;

import lombok.extern.slf4j.Slf4j;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

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.Charset;

/***

* @author mazaiting

* @date 2019-06-27

* @decription HttpServletRequest 包装器

* 解决: request.getInputStream()只能读取一次的问题

* 目标: 流可重复读

*/

@Slf4j

public class RequestWrapper extends HttpServletRequestWrapper {

/**

* 日志

*/

private static final Logger mLogger = LoggerFactory.getLogger(RequestWrapper.class);

/**

* 请求体

*/

private String mBody;

public RequestWrapper(HttpServletRequest request) {

super(request);

// 将body数据存储起来

mBody = getBody(request);

}

/**

* 获取请求体

* @param request 请求

* @return 请求体

*/

private String getBody(HttpServletRequest request) {

try {

return StreamUtil.getString(request.getInputStream());

} catch (IOException e) {

mLogger.debug(e.getMessage());

throw new RuntimeException(e);

}

}

/**

* 获取请求体

* @return 请求体

*/

public String getBody() {

return mBody;

}

@Override

public BufferedReader getReader() throws IOException {

return new BufferedReader(new InputStreamReader(getInputStream()));

}

@Override

public ServletInputStream getInputStream() throws IOException {

// 创建字节数组输入流

final ByteArrayInputStream bais = new ByteArrayInputStream(mBody.getBytes(Charset.defaultCharset()));

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 bais.read();

}

};

}

}

5).设置过滤器(必须)

@Component

@WebFilter(filterName = "HttpServletRequestFilter", urlPatterns = "/")

@Order(10000)

public class HttpServletRequestFilter implements Filter {

@Override

public void init(FilterConfig filterConfig) throws ServletException {

}

@Override

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

ServletRequest requestWrapper = null;

if(servletRequest instanceof HttpServletRequest) {

requestWrapper = new RequestWrapper((HttpServletRequest) servletRequest);

}

//获取请求中的http://流如何,将取出来的字符串,再次转换成流,然后把它放入到新request对象中

// 在chain.doFiler方法中传递新的request对象

if(null == requestWrapper) {

filterChain.doFilter(servletRequest, servletResponse);

} else {

filterChain.doFilter(requestWrapper, servletResponse);

}

}

@Override

public void destroy() {

}

}

6). 使用

/***

*

* @author mazaiting

* @date 2019-06-26

* @decription Session -

*/

public classOZPoFrl SessionInterceptor implements HandlerInterceptor {

/**

* 日志

*/

private static final Logger mLogger = LoggerFactory.getLogger(SessionInterceptor.class);

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

mLogger.debug("SessionInterceptor");

// 获取地址

String url = request.getRequestURL().toString();

mLogger.debug("url: " + url);

// 获取 session

HttpSession session = request.getSession();

String id = session.getId();

mLogger.debug("sessionId: " + id);

String requestMethod = request.getMethod();

mLogger.debug("requestMethod: " + requestMethod);

String servletPath = request.getServletPath();

mLogger.debug("servletPath: " + servletPath);

if (isjson(request)) {

String body = new RequestWrapper(request).getBody();

mLogger.debug("body: " + body);

}

return true;

}

/**

* 判断本次请求的数据类型是否为json

*

* @param request request

* @return true: 是 JSON 数据; false: 非 json 数据

*/

private boolean isJson(HttpServletRequest request) {

if (request.getContentType() != null) {

return request.getContentType().equals(MediaType.APPLICATION_JSON_VALUE) ||

request.getContentType().equals(MediaType.APPLICATION_JSON_UTF8_VALUE);

}

return false;

}

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:easyPHP-Swoole 专为API而生,是一款常驻内存化的PHP开发框架
下一篇:Spring从入门到精通(六)—实例化Bean的三种⽅式
相关文章

 发表评论

暂时没有评论,来抢沙发吧~