之前写了篇自定义注解,这次的注解原理依旧是java的annotation以及反射机制,不过是结合了spring mvc框架而已
做一个简单的比较常用的参数注解,用来获取当前的登录用户。
首先定义一个参数类型的注解CurrentUser
/**
* @author uiao
* @Title: 自定义参数类型的注解
* @date 2018/8/315:36
*/
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CurrentUser {
}
之后要实现HandlerMethodArgumentResolver,重写resolveArgument方法。在这要注意重写的supportsParameter方法一定要加上自定义的注解,否则并不会起到作用。
/**
* @author uiao
* @Title: CurrentUserArgumentResolver
* @Description: 重写参数解析器,获取当前用户
* @date 2018/8/717:34
*/
public class CurrentUserArgumentResolver implements HandlerMethodArgumentResolver{
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.getParameterAnnotation(CurrentUser.class) != null;
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
String user = (String) request.getSession().getAttribute("username");
if (StringUtil.isEmpty(user)) {
user = "游客";
}
return user;
}
}
其次还要将我们自己实现的CurrentUserArgumentResolver加入到参数解析器中,本文的例子我们是用spring boot做的,用spring boot时一般我们都会自己写一个mvc适配器,继承自WebMvcConfigurerAdapter,然后我们会在这个适配器里引入各种我们自己实现的配置,例如拦截器,静态资源,页面跳转等。注意:这个适配器必须要加@Configuration这个注解,在项目启动才会加载我们自己实现的配置。
**
* 适配器 要加上@Configuration才可以起作用
* Created by Administrator on 2017/9/20.
*/
@Configuration
public class MyWebMvcConfigureAdapter extends WebMvcConfigurerAdapter {
/**
* 添加拦截器
* 优先级为:静态资源 > 拦截器exclude > 拦截器pattern > 页面跳转(addViewControllers)
*
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**") // 这些会被拦截
.excludePathPatterns("/", "/login", "/login/prelogin", "/login/dologin"); // 这些不会拦截
super.addInterceptors(registry);
}
/**
* 添加自定义的参数解析器
*
* @param argumentResolvers
*/
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new CurrentUserArgumentResolver());
}
}
使用@CurrentUser注解
/**
* @author uiao
* @Title: CurrentDemoController
* @Description: currentUser注解测试类
* @date 2018/8/717:49
*/
@Controller
@RequestMapping(value = "current", method = RequestMethod.GET)
public class CurrentDemoController {
org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(CurrentDemoController.class);
@GetMapping("getname")
public String converter(Map<String, Object> model, @CurrentUser String user) {
logger.info("当前用户为 ==>>");
logger.info(user);
model.put("name", user);
return "home";
}
}
登录后控制台及页面输出的结果
请求url : http://localhost:8080/current/getname
请求uri : /current/getname
请求方法 : GET
权限验证成功
2018-08-07 23:59:27.696 [http-nio-8080-exec-4] INFO c.u.s.c.CurrentDemoController - 当前用户为 ==>>
2018-08-07 23:59:27.696 [http-nio-8080-exec-4] INFO c.u.s.c.CurrentDemoController - cuihao
end。。。
另外,如果我们的项目是spring mvc,实现过程大同小异,只是需要把在适配器中使用addArgumentResolvers方法引入自建参数解析器。换成在xml内配置参数解析器就行。可以参考这篇博文。http://www.cnblogs.com/yangzhilong/p/6282218.html