前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringMVC Context 获取

SpringMVC Context 获取

原创
作者头像
ruochen
发布2021-12-06 13:24:04
7540
发布2021-12-06 13:24:04
举报
文章被收录于专栏:若尘的技术专栏

1. 定义 User 类

代码语言:txt
复制
import lombok.AllArgsConstructor;
代码语言:txt
复制
import lombok.Builder;
代码语言:txt
复制
import lombok.Data;
代码语言:txt
复制
import lombok.NoArgsConstructor;
代码语言:txt
复制
@Data
代码语言:txt
复制
@NoArgsConstructor
代码语言:txt
复制
@AllArgsConstructor
代码语言:txt
复制
@Builder
代码语言:txt
复制
public class User {
代码语言:txt
复制
    private Long id;
代码语言:txt
复制
    private String name;
代码语言:txt
复制
}

2. 定义 CurrentUser 注解

代码语言:txt
复制
import java.lang.annotation.ElementType;
代码语言:txt
复制
import java.lang.annotation.Retention;
代码语言:txt
复制
import java.lang.annotation.RetentionPolicy;
代码语言:txt
复制
import java.lang.annotation.Target;
代码语言:txt
复制
/**
代码语言:txt
复制
 * 自定义 当前用户 注解
 * 注解 参数
 * 此注解在验证token通过后,获取当前token包含用户
 */
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUser {
}

3. 实现 HandlerMethodArgumentResolver

代码语言:txt
复制
import lombok.extern.slf4j.Slf4j;
代码语言:txt
复制
import org.springframework.core.MethodParameter;
代码语言:txt
复制
import org.springframework.web.bind.support.WebDataBinderFactory;
代码语言:txt
复制
import org.springframework.web.context.request.NativeWebRequest;
代码语言:txt
复制
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
代码语言:txt
复制
import org.springframework.web.method.support.ModelAndViewContainer;
代码语言:txt
复制
import javax.servlet.http.Cookie;
代码语言:txt
复制
import javax.servlet.http.HttpServletRequest;
代码语言:txt
复制
import java.util.Arrays;
代码语言:txt
复制
import java.util.Optional;
代码语言:txt
复制
/**
代码语言:txt
复制
 * @CurrentUser 注解 解析器
 */
@Slf4j
public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        // 1. User 类的对象是否可以分配给当前的方法参数
        boolean assignable = parameter.getParameterType().isAssignableFrom(User.class);
        // 2. 当前方法参数上是否有 CurrentUser 的注解
        boolean hasAnnotation = parameter.hasParameterAnnotation(CurrentUser.class);
        return assignable && hasAnnotation;
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
代码语言:txt
复制
        HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
代码语言:txt
复制
        Optional<String> id = getValue(request, "id");
代码语言:txt
复制
        Optional<String> name = getValue(request, "name");
代码语言:txt
复制
        return User.builder()
代码语言:txt
复制
            .id(id.map(Long::parseLong).orElse(null))
代码语言:txt
复制
            .name(name.orElse(null))
代码语言:txt
复制
            .build();
代码语言:txt
复制
    }
代码语言:txt
复制
    private Optional<String> getValue(HttpServletRequest request, String name) {
代码语言:txt
复制
        return Arrays.stream(request.getCookies())
代码语言:txt
复制
            .filter(c -> c.getName().equals(name))
代码语言:txt
复制
            .findFirst()
代码语言:txt
复制
            .map(Cookie::getValue);
代码语言:txt
复制
    }
代码语言:txt
复制
}

4. 配置 WebMvcConfig

CurrentUserMethodArgumentResolver 添加到 SpringMVC 中。

代码语言:txt
复制
import org.springframework.context.annotation.Configuration;
代码语言:txt
复制
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
代码语言:txt
复制
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
代码语言:txt
复制
import java.util.List;
代码语言:txt
复制
@Configuration
代码语言:txt
复制
public class WebMvcConfig extends WebMvcConfigurationSupport {
代码语言:txt
复制
    @Override
代码语言:txt
复制
    protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
代码语言:txt
复制
        argumentResolvers.add(new CurrentUserMethodArgumentResolver());
代码语言:txt
复制
    }
代码语言:txt
复制
}

5. 通过 Controller 进行测试

代码语言:txt
复制
import lombok.extern.slf4j.Slf4j;
代码语言:txt
复制
import org.springframework.web.bind.annotation.GetMapping;
代码语言:txt
复制
import org.springframework.web.bind.annotation.RestController;
代码语言:txt
复制
@RestController
代码语言:txt
复制
@Slf4j
代码语言:txt
复制
public class DemoController {
代码语言:txt
复制
    @GetMapping("/test")
代码语言:txt
复制
    public User test(@CurrentUser User user) {
代码语言:txt
复制
        log.info("user: {}", user);
代码语言:txt
复制
        return user;
代码语言:txt
复制
    }
代码语言:txt
复制
}

启动服务,通过 postman 调用 /test 接口进行测试。

5.1 cookie 为空

cookie 为空

5.2 cookie 只包含 id

代码语言:txt
复制
id=1

cookie 只包含id

5.3 cookie 包含id和 name

代码语言:txt
复制
id=1;name=joy

cookie 包含id和 name

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 定义 User 类
  • 2. 定义 CurrentUser 注解
    • 3. 实现 HandlerMethodArgumentResolver
    • 4. 配置 WebMvcConfig
      • 5. 通过 Controller 进行测试
        • 5.1 cookie 为空
          • 5.2 cookie 只包含 id
            • 5.3 cookie 包含id和 name
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档