SpringBoot对请求体和响应体进⾏处理
有时需要对请求或返回的数据进⾏加密,那么SpringBoot 就提供了⽀持,可对请求体进⾏处理,也可对响应体进⾏处理。
1.对请求体处理
对响应体进⾏处理,需要实现RequestBodyAdvice接⼝,重写⽅法。
fig;
slf4j.Slf4j;
import MethodParameter;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpInputMessage;
import org.verter.HttpMessageConverter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.hod.annotation.RequestBodyAdvice;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import flect.Type;
import java.nio.charset.StandardCharsets;
@Component
@ControllerAdvice
@Slf4j
public class DecodeRequestBodyAdvice implements RequestBodyAdvice {
@Override
public boolean supports(MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
return true;
}
@Override
public HttpInputMessage beforeBodyRead(HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) { //获取请求头信息
String header = Headers().getFirst("header");
log.info("获取的请求头header:{}", header);
String body = null;
try {
// 从流中提取数据
InputStream is = Body();
byte[] data = new byte[is.available()];
body = new String(data, StandardCharsets.UTF_8);
log.info("请求的数据,{}", body);
//对数据进⾏处理
} catch (IOException e) {
e.printStackTrace();
}
return new Headers(), new Bytes(StandardCharsets.UTF_8)));
}
@Override
public Object afterBodyRead(Object body, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) { return body;
}
@Override
public Object handleEmptyBody(Object body, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) { return body;
}
static class DecodedHttpInputMessage implements HttpInputMessage {
HttpHeaders headers;
InputStream body;
public DecodedHttpInputMessage(HttpHeaders headers, InputStream body) {
this.headers = headers;
this.body = body;
}
@Override
public InputStream getBody() {
return body;
}
@Override
public HttpHeaders getHeaders() {
return headers;
}
}
}
需要注意是,其仅针对@RequestBody注解⽣效,也就是说要必须是POST请求,使⽤@RequestBody注解接收,才能执⾏上述的操作。否则不⽣效,如下:
@RestController
public class TestController {
@PostMapping("/test")
public JSONObject get(@RequestBody JSONObject json) {
return json;
}
}
2.对响应体处理
对响应体进⾏处理,需要新建类,实现ResponseBodyAdvice 接⼝,重写⽅法。
fig;
slf4j.Slf4j;
import MethodParameter;
import org.springframework.http.MediaType;
import org.verter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.hod.annotation.ResponseBodyAdvice;
@Component
@ControllerAdvice
@Slf4j
public class EncodeResponseBodyAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
//若返回false则下⾯的配置不⽣效
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpRespon //获取请求头信息,需要时获取
springframework和springbootString header = Headers().getFirst("header");
log.info("获取的请求头header:{}",header);
//body即是返回的数据,可对其进⾏处理后返回,如加密
return body;
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。