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

沙海 2021年7月20日01:10:21Java评论125字数 1468阅读4分53秒阅读模式
摘要

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

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

不装逼的程序员 文章源自JAVA秀-https://www.javaxiu.com/38175.html

在使用SpringMVC进行项目的时候用到了权限验证。文章源自JAVA秀-https://www.javaxiu.com/38175.html

表分为:文章源自JAVA秀-https://www.javaxiu.com/38175.html

用户表;文章源自JAVA秀-https://www.javaxiu.com/38175.html

角色表;文章源自JAVA秀-https://www.javaxiu.com/38175.html

资源表。文章源自JAVA秀-https://www.javaxiu.com/38175.html

用户-角色-资源都是多对多的关系,验证无非就是收到请求后,在拦截器循环判断用户是否有权限执行操作。文章源自JAVA秀-https://www.javaxiu.com/38175.html

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

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

preHandle方法中handler实际为HandlerMethod,(看网上说的有时候不是HandlerMethod),加个instanceof验证吧文章源自JAVA秀-https://www.javaxiu.com/38175.html

可以得到方法名:h.getMethod().getName()文章源自JAVA秀-https://www.javaxiu.com/38175.html

可以得到RequestMapping注解中的值:h.getMethodAnnotation(RequestMapping.class)文章源自JAVA秀-https://www.javaxiu.com/38175.html

这种方法还是不太方便文章源自JAVA秀-https://www.javaxiu.com/38175.html

方法三:自定义注解

自定义注解代码:文章源自JAVA秀-https://www.javaxiu.com/38175.html

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

Controller代码:文章源自JAVA秀-https://www.javaxiu.com/38175.html

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

拦截器的代码:文章源自JAVA秀-https://www.javaxiu.com/38175.html

@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);}

在每个方法上面加注解太麻烦啦,可以在类上加注解文章源自JAVA秀-https://www.javaxiu.com/38175.html

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

我可以获取requestMapping,不用创建自定义注解啊,值得注意的是,不要使用GetMapping等,要使用requestMapping文章源自JAVA秀-https://www.javaxiu.com/38175.html

继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

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

确定