ResponseBodyAdvice 无法拦截的问题
记录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
}
本文作者:傲浮
本文链接:https://www.cnblogs.com/offerwx/p/15716194.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步