记录ResponseBodyAdvice无法对上传与下载接口进行拦截
代码 :ResponseBodyAdvice实现
@Component
@ControllerAdvice
public class LogResponseBodyAdvice implements ResponseBodyAdvice {
private static Logger logger = LoggerFactory.getLogger(LogResponseBodyAdvice.class);
@Autowired
private LogService logService;
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
// 判断是否要执行beforeBodyWrite方法,true为执行,false不执行 ——
// 通过supports方法,我们可以选择哪些类或哪些方法要对response进行处理,其余的则不处理
// 这里对自定义注解进行判断
OperateLog operateLog = returnType.getMethod().getAnnotation(OperateLog.class);
return operateLog != null;
}
@Override
public Object beforeBodyWrite(Object returnValue, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
//保存逻辑
saveOperateLog(returnValue, returnType, request, response);
return returnValue;
}
/**
* 保存操作日志
*
* @param returnValue controller方法返回值
* @param returnType
* @param request
* @param response
*/
private void saveOperateLog(Object returnValue, MethodParameter returnType, ServerHttpRequest request, ServerHttpResponse response) {
try {
OperateLog operateLog = returnType.getMethod().getAnnotation(OperateLog.class);
String log = resolveOperateLog(returnValue, operateLog);
if(StringUtils.isNotBlank(log)){
ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
HttpServletRequest req = servletRequest.getServletRequest();
ServletServerHttpResponse servletResponse = (ServletServerHttpResponse) response;
HttpServletResponse resp = servletResponse.getServletResponse();
/// 。。。。
// 具体的保存逻辑
}
} catch (Exception e) {
logger.error("执行OperateLogResponseBodyAdvice出现错误", e);
}
}
}
代码:Controller:控制层(无法被拦截到的方法)
@ApiOperation(value = "下载Excel数据")
@GetMapping("/download/excel")
@OperateLog(
prop = "manager.excel.downloadactResult",
moduleName ="文件下载模块",
operateName = "下载Excel数据"
)
@ResponseBody
public void downloadactResult(@ApiParam(value = "数据ID") @RequestParam("id") Integer id,
HttpServletRequest request, HttpServletResponse response) {
try {
// 具体的下载逻辑
xxxxx
}
代码:Controller:控制层(可以被拦截到的方法)
@ApiOperation(value = "下载Excel数据")
@GetMapping("/download/excel")
@OperateLog(
prop = "manager.excel.downloadactResult",
moduleName ="文件下载模块",
operateName = "下载Excel数据"
)
@ResponseBody
public void downloadactResult(@ApiParam(value = "数据ID") @RequestParam("id") Integer id) {
try {
// 从请求上下文里获取Request对象
ServletRequestAttributes requestAttributes = ServletRequestAttributes.class.
cast(RequestContextHolder.getRequestAttributes());
HttpServletRequest request1 = requestAttributes.getRequest();
HttpServletResponse response1 = requestAttributes.getResponse();
// 具体的下载逻辑
xxxxx
}
欢迎大家关注在线刷题小程序