自定义注解获取当前登录用户
在做项目的时候,我们经常会用到当前登录的用户,获取这个用户相关的信息,总是用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
}
如果你觉得这种方法,好用,可以尝试下;