首页 > 其他分享 >SpringMVC里通过ResponseBodyAdvice接口实现统一自定义返回逻辑

SpringMVC里通过ResponseBodyAdvice接口实现统一自定义返回逻辑

时间:2023-06-06 09:57:35浏览次数:45  
标签:cookies http 自定义 SpringMVC request springframework ResponseBodyAdvice org import

这个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));
            
        }
    }
}

 

标签:cookies,http,自定义,SpringMVC,request,springframework,ResponseBodyAdvice,org,import
From: https://www.cnblogs.com/shamo89/p/17459692.html

相关文章

  • 8. 自定义映射resultMap
    ‍在Mybatis中,resultType和resultMap都用于定义查询结果的映射关系。它们的使用场景如下:resultTyperesultType用于指定返回结果的数据类型,通常用于返回简单类型的结果以及返回vo或dto等自定义类型的结果。例如:‍<selectid="findUserById"parameterType="int"r......
  • Vue自定义指令-让你的业务开发更简单
    1、使用场景在日常开发中,我们会将重复代码抽象为一个函数或者组件,然后在需要时调用或者引入。但是,对于某些功能,这种方法可能不够优雅或者不够灵活。例如,我们可能需要在DOM元素上添加一些自定义属性或者绑定一些事件,这些操作可能难以通过函数或组件来实现。这时,自定义指令就派上用......
  • qt 中的自定义pushbutton
       ......
  • WPF自学入门(四)WPF路由事件之自定义路由事件
      在上一篇博文中写到了内置路由事件,其实除了内置的路由事件,我们也可以进行自定义路由事件。接下来我们一起来看一下WPF中的自定义路由事件怎么进行创建吧。创建自定义路由事件分为3个步骤:1、声明并注册路由事件。2、利用CLR事件包装路由事件(封装路由事件)。3、创建可以激发路由......
  • SpringMVC 国际化 Hibernate Validator 扩展注解
    高版本JDKHibernateValidator扩展注解https://stackoverflow.com/questions/35986200/error-creating-bean-with-name-org-springframework-validation-beanvalidation-opt1.JDK8版本需要添加的jar包springmvc验证需要的jar├─classmate-0.8.0.jar├─hibernate-v......
  • 二、Spring Reactive Security自定义登录页
    添加配置类:@ConfigurationpublicclassMyReactiveSecurityConfig{@BeanpublicReactiveUserDetailsServicereactiveUserDetailsService(){UserDetailsuser=User.withUsername("user").password("12345")......
  • 为什么在stdio.h写自定义的宏不行?
    在自定义的头文件写可以: 这样写不行: ......
  • Asp.NetCore 自定义中间件
    这节演示一下自定义中间件,第一节我们讲到,中间件的处理流程就像一个俄罗斯套娃,那这种俄罗斯套娃型的流程内部是如何实现的呢,下面请看代码。    第一种写法是直接写在Configure方法中的,使用app.Use(委托)配合lambda表达式使用,适合很轻量级的中间件。app.Use(async(context,next......
  • wpf 自定义 RadioButton.
    <StyleTargetType="RadioButton"x:Key="nav"><SetterProperty="Template"><Setter.Value><ControlTemplateTargetType="RadioButton">......
  • springmvc架构流程
    1、 用户发送请求至前端控制器DispatcherServlet2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。3、 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。4、 DispatcherServlet通过HandlerAdap......