SpringMVC里通过ResponseBodyAdvice接口实现统一自定义返回逻辑
这个org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice接口。
public interface ResponseBodyAdvice<T> {
// 返回true代表走自定义逻辑 boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType);
// 实现该方法完成自己的逻辑 @Nullable T beforeBodyWrite(@Nullable T body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response); }
举个简单的示例,我是统一在`/app`接口里加上cookie设置,为什么不在interceptor里做呢?因为在拦截器里设置cookie无效。
import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.core.MethodParameter; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.http.server.ServletServerHttpResponse; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; import javax.servlet.http.Cookie; import java.net.URI; /** * @Author: 夏威夷8080 * @Date: 1970/6/5 15:04 */ @ControllerAdvice @Slf4j public class AppCookieAdvice implements ResponseBodyAdvice<Object> { @Override public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { return true; } @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest httpRequest, ServerHttpResponse httpResponse) { ServletServerHttpRequest request = (ServletServerHttpRequest) httpRequest; ServletServerHttpResponse response = (ServletServerHttpResponse)httpResponse; this.setTargetCookie(request, response); return body; } private void setTargetCookie(ServletServerHttpRequest request, ServletServerHttpResponse response) { URI uri = request.getURI(); String url = uri.toString(); log.info("Advice里获取的url:{}", url); if (StringUtils.isNotBlank(url) && url.contains("/app/")) { Cookie[] cookies = request.getServletRequest().getCookies(); log.info("Advice里request里的的cookie={}", JSON.toJSONString(cookies)); if (cookies != null && cookies.length > 0) { for (int i = 0; i < cookies.length; i++) { Cookie ck = cookies[i]; // ... } } Cookie cookieNew = new Cookie('key', 'value'); cookieNew.setPath("/"); response.getServletResponse().addCookie(cookieNew); log.info("准备设置的cookie={}", JSON.toJSONString(cookieNew)); } } }
标签:
springmvc
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话