在开发过程中,我们经常需要用到当前登录用户的信息。那如何优雅而又方便的拿呢?强大的spring大表哥已经帮我们想好了。
1.创建自己的自定义注解。如下,创建@CurrUser
/*** 当前用登录户注解* Created by caidapao on /3/30* Time 21:58*/@Target({ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface CurrUser {/*** 当前用户在session对象中的key,GlobalExt.CURRENT_MANAGER是个全局字符串*/String value() default GlobalExt.CURRENT_MANAGER;}
PS:
1.@Target指定注解的使用范围,这里我们指定ElementType为PARAMETER,也就是参数即可。
2.@Retention作用是定义该注解能保留多久,一共有三种策略,这里我们指定为RUNTIME,也就是运行时。
2.创建@CurrUser的解析器类,该类实现spring的HandleMethodArgumentResolver
/*** 实现@currUser的参数解析器* Created by caidapao on /3/30* Time 22:02*/public class CurrUserMethodArgumentResolver implements HandlerMethodArgumentResolver {@Overridepublic boolean supportsParameter(MethodParameter methodParameter) {if(methodParameter.hasParameterAnnotation(CurrUser.class)){return true;}return false;}@Overridepublic Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {CurrUser currentUserAnnotation = methodParameter.getParameterAnnotation(CurrUser.class);return nativeWebRequest.getAttribute(currentUserAnnotation.value(), NativeWebRequest.SCOPE_SESSION);}}
PS:
这里要重载两个方法。
1.supportsParameter方法,判断什么时候要执行下面的resolveArgument方法。这里我们判断当一个方法的参数含有@CurrUser的时候返回true。
2.resolveArgument方法,在这里我们直接把放在session中的用户信息放回去即可。
3.配置自己的注解解析器交给spring统一管理。
3.1.如果你的项目的配置使用spring-servlet.xml(名字不一定是这个)进行配置的,则添加如下配置:
<!-- 这里配置的argument-resolvers 最终是被注入到了 RequestMappingHandlerAdapter类的customArgumentResolvers字段值中--><!-- 然后交给spring统一管理--><mvc:annotation-driven><mvc:argument-resolvers><bean class="mon.annotation.impl.CurrUserMethodArgumentResolver"/>//这里是你的解析器路径</mvc:argument-resolvers></mvc:annotation-driven>
3.2.如果你不喜欢丢在xml里面,那也可以通过创建自己的WebCofing.java通过代码来配置,如下:
/*** web 配置* Created by caidapao on /4/2* Time 23:38*/@Configurationpublic class WebConfigurer extends WebMvcConfigurerAdapter {/*** 其实从这里看出来,与配置在spring-servlet.xml中相比,都是实例化一个自己注解解析器,* 然后将它add进spring的List<HandlerMethodArgumentResolver> argumentResolvers中* 最后交给spring统一管理* @param argumentResolvers*/@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {argumentResolvers.add(currUserMethodArgumentResolver());super.addArgumentResolvers(argumentResolvers);}/*** 实例化自己的注解解析器* @return*/@Beanpublic CurrUserMethodArgumentResolver currUserMethodArgumentResolver() {return new CurrUserMethodArgumentResolver();}}
4.测试。这里我们访问/managers/login将登录的用户信息直接放在session中,然后访问/managers/testCurrUser
/*** 管理员* Created by caidapao on /1/2.* Time 19:38*/@Controller@RequestMapping("/managers")public class ManagersController {/*** 模拟管理员登录* @param loginVo* @param session* @throws UserLoginException*/@ResponseBody@RequestMapping(value = "/login")public Object login(LoginVo loginVo, HttpSession session) throws UserLoginException {Managers managers = ServiceManager.managersService.checkLogin(loginVo.getUsername(),loginVo.getPassword());//这里我们直接放入sessionsession.setAttribute(GlobalExt.CURRENT_MANAGER,managers);return managers;}/*** 测试注解是否能拿到值* @param managers* @return*/@ResponseBody@RequestMapping(value = "/testCurrUser")public Object testCurrUser(@CurrUser Managers managers) {return managers;}}
测试结果:
全文完。希望各位同学看完后能有所收获,不仅仅是获取当前登录用户的信息,只要是方法参数的注解,本文都是有帮助的。
如果这篇文章对你有帮助,可以点赞鼓励一下嘛~
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。关注作者的订阅号:java-caidapao,获取更多技术干货,和大炮老哥一起从零成为技术大牛。