• 自定义注解获取当前登录用户


    在做项目的时候,我们经常会用到当前登录的用户,获取这个用户相关的信息,总是用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

             

    }

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

  • 相关阅读:
    使用JDBC连接MySql时出现:The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration
    Mysql Lost connection to MySQL server at ‘reading initial communication packet', system error: 0
    mysql-基本命令
    C# 监听值的变化
    DataGrid样式
    C# 获取当前日期时间
    C# 中生成随机数
    递归和迭代
    PHP 时间转几分几秒
    PHP 根据整数ID,生成唯一字符串
  • 原文地址:https://www.cnblogs.com/luojiesheng/p/9776979.html
Copyright © 2020-2023  润新知