自定义系列 之 基于参数解析器的参数注解

    之前写了篇自定义注解,这次的注解原理依旧是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

猜你喜欢

转载自blog.csdn.net/fanxing1964/article/details/81486409
今日推荐