Springboot之自定义HandlerMethodArgumentResolver获取当前登陆者

    Springboot版本是2.0.5.release。

    一般在controller方法中要获取当前登陆者,我们可以自定义HandlerMethodArgumentResolver来实现,如下:

List-1

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser {

}
...
public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.getParameterType().isAssignableFrom(UserVo.class) &&
                methodParameter.hasParameterAnnotation(LoginUser.class);
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        return SpringHelper.getLoginUser();
    }
}

...

@Configuration
public class WebSecurityConfig implements WebMvcConfigurer {


    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new LoginUserHandlerMethodArgumentResolver());
    }
...

public class SpringHelper {

    public static HttpServletRequest getCurrentRequest() {
        HttpServletRequest request = null;
        try {
            RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
            if (null==requestAttributes){
                return null;
            }
            request = ((ServletRequestAttributes)requestAttributes ).getRequest();
        } catch (Exception e) {
            return request;
        }
        return request;
    }

    public static UserVo getLoginUser() {
        return (UserVo) getCurrentRequest().getSession().getAttribute(WebSecurityConfig.SESSION_KEY);
    }
}

List-2

public List<PasgrInfoFlightVo> queryIDInfo(@LoginUser UserVo userVo) throws AicException {
  ...
}
  1. List-1中,我们自定义了LoginUserHandlerMethodArgumentResolver,方法supportsParameter返回true标示支持此参数的解析,之后会调用resolveArgument进行参数的解析。
  2. List-2中,我们直接在controller的方法上加上@LoginUser注解,之后Spring会自动将userVo传入。

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏架构探险之道

Spring Security SSO 授权认证(OAuth2)

我们将讨论如何使用Spring Security OAuth2和Spring Boot实现SSO - 单点授权认证。

18820
来自专栏架构探险之道

[Spring Boot] spring-boot-starter-data-jpa

JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关...

22010
来自专栏架构探险之道

Spring Boot 整合 Activiti 6.0.0 工作流引擎开发

本教程基于Activiti 6.0.0 ,着力介绍工作流引擎Activiti6.0.0引擎和Spring Boot的整合开发,帮助初学者入门。

82520
来自专栏吟风者

springboot使用cache缓存

Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheMa...

10720
来自专栏架构探险之道

[Swagger] Spring MVC 组件配置 之 Swagger整合

10920
来自专栏架构探险之道

[Flowable] 集成Spring Boot和流程设计编辑器破解教程程

本文主要为了开发学习和分享,转载请注明出处。Flowable的使用请尽量使用官方发布版本,涉及知识产权部分请谨慎使用,尤其是公司产品开发过程中,请特别注意!

1.2K30
来自专栏架构探险之道

Spring Boot 整合Dubbo开发实战

Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度...

10230
来自专栏架构探险之道

[Spring Boot] Spring boot 整合mybatis、postgresql [Gradle构建项目]

33710
来自专栏架构探险之道

[Swagger] Swagger 接口管理和文档导出

title: date: 2018-08-25 19:22:00 categories:

23710
来自专栏架构探险之道

Spring Boot 整合 LDAP 开发教程

LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务。目录服务是一种特殊...

19810

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励