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


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

         

          

           
                     
           

         

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

4.写在controller里

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

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

                   ......省略XXXX

         

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