如何使用拦截器获取Controller方法名和注解信息?

沙海
沙海
沙海
1789
文章
2
评论
2021年7月20日01:10:21
评论
3 1468字阅读4分53秒
摘要

如何使用拦截器获取Controller方法名和注解信息? 不装逼的程序员

如何使用拦截器获取Controller方法名和注解信息?

不装逼的程序员

在使用SpringMVC进行项目的时候用到了权限验证。

表分为:

用户表;

角色表;

资源表。

用户-角色-资源都是多对多的关系,验证无非就是收到请求后,在拦截器循环判断用户是否有权限执行操作。

方法一:通过request获得用户的URI,再逐一循环判断是否可以操作。只是这种方法很让人难受。

方法二:通过用户要访问的方法来判断是否有权限:

preHandle方法中handler实际为HandlerMethod,(看网上说的有时候不是HandlerMethod),加个instanceof验证吧

可以得到方法名:h.getMethod().getName()

可以得到RequestMapping注解中的值:h.getMethodAnnotation(RequestMapping.class)

这种方法还是不太方便

方法三:自定义注解

自定义注解代码:

@Retention(RUNTIME)@Target(METHOD)public @interface MyOperation {    String value() default "";//默认为空,因为名字是value,实际操作中可以不写"value="}

Controller代码:

@Controller("testController")public class TestController {    @MyOperation("用户修改")//主要看这里    @RequestMapping("test")    @ResponseBody    public String test(String id) {        return "Hello,2018!"+id;    }}

拦截器的代码:

@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)        throws Exception {    System.out.println("进入拦截器");    if(handler instanceof HandlerMethod) {        HandlerMethod h = (HandlerMethod)handler;        System.out.println("用户想执行的操作是:"+h.getMethodAnnotation(MyOperation.class).value());        //判断后执行操作...    }    return HandlerInterceptor.super.preHandle(request, response, handler);}

在每个方法上面加注解太麻烦啦,可以在类上加注解

@Retention(RUNTIME)@Target(TYPE)public @interface MyOperation {    String value() default "";}//拦截器中这样获得h.getMethod().getDeclaringClass().getAnnotation(MyOperation.class);

我可以获取requestMapping,不用创建自定义注解啊,值得注意的是,不要使用GetMapping等,要使用requestMapping

继续阅读
weinxin
资源分享QQ群
本站是一个IT技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: