zoukankan      html  css  js  c++  java
  • 自定义注解获取当前登录用户

    在做项目的时候,我们经常会用到当前登录的用户,获取这个用户相关的信息,总是用User user = session.getAttribute("user"); 这个写的次数太多,还要获取session实在太费事,能不能简单,实用呢?

    今天,我们就来探讨,注解实现参数解析,放在session中;

    1.首先,我们创建一个自己的自定义注解;

    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;

    @Target({ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface SA {


    }

    解释下:@Target({ElementType.PARAMETER})  这个是元注解(用来定义注解的注解称为元注解),它的意思是这个注解是一个注解参数的注解;

                  @Retention(RetentionPolicy.RUNTIME)  这个意思是:在java代码编译时,jvm运行时都会存在;

                  @Documented  它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中;这个解释我也没仔细研究过,但是你想仔细研究的话可以去查查,这里不再阐述;

    2.写好以上注解后,我们还要解析下这个注解,是用来做什么的,该类实现spring的HandlerMethodArgumentResolver;

    import org.springframework.core.MethodParameter;
    import org.springframework.web.bind.support.WebDataBinderFactory;
    import org.springframework.web.context.request.NativeWebRequest;
    import org.springframework.web.method.support.HandlerMethodArgumentResolver;
    import org.springframework.web.method.support.ModelAndViewContainer;

    import com.look.sys.bind.annotation.SA;

    public class SaResolver implements HandlerMethodArgumentResolver {

                 @Override
                public boolean supportsParameter(MethodParameter parameter) {
                           return parameter.hasParameterAnnotation(SA.class);
                   }

                @Override
                public Object resolveArgument(MethodParameter p, ModelAndViewContainer mavContainer,
                NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
                           return webRequest.getAttribute(p.getParameterName(), NativeWebRequest.SCOPE_SESSION);
                     }

             }

    解释下: supportsParameter  这个方法返回boolean  值,如果是true,就是如果这个注解被用到,就继续执行下面的resolveArgument,把session值放在SA注解中;

                   HandlerMethodArgumentResolver  看到名称我们也就知道这个是处理方法参数的解析器;

    3.把自己的注解解析器交给spring容器进行管理;

             <!-- 然后交给spring统一管理-->

              <mvc:annotation-driven>

                <mvc:argument-resolvers>
                          <bean class="com.look.sys.bind.resolver.SaResolver"/>
               </mvc:argument-resolvers>

             </mvc:annotation-driven>

    到这里我们,就把注解@SA 写好,并解析了,那么怎么用呢?

    4.写在controller里

    @RequestMapping("/")
    public String index(@SA User user,HttpServletRequest request, Integer type) {

                      Stirng userId = user.getUserId();//获取userId

                       ......省略XXXX

             

    }

    如果你觉得这种方法,好用,可以尝试下;

  • 相关阅读:
    20199319 2019-2020-2 《网络攻防实践》第七周作业
    《访问控制策略描述和应用》阅读总结
    密码学基础学习-序列密码
    密码学基础学习-1
    《一种普适计算下的访问控制策略》阅读总结
    20199319 2019-2020-2 《网络攻防实践》第五周作业
    《访问控制策略描述语言与策略冲突研究》阅读总结
    20199319 2019-2020-2 《网络攻防实践》第四周作业
    20199319 2019-2020-2 《网络攻防实践》第三周作业
    记录旧手机(米6)安装Linux(Ubuntu16.04)踩过的坑
  • 原文地址:https://www.cnblogs.com/luojiesheng/p/9776979.html
Copyright © 2011-2022 走看看