从上下文中获取所有的原生controller

1 /**
2 * 获取项目所有被注解修饰的url
3 * @param run
4 */
5 public void getAllUrl(ConfigurableApplicationContext run) {
6 //获取restcontroller注解的类名
7 String[] beanNamesForAnnotation = run.getBeanNamesForAnnotation(RestController.class);
8 //获取类对象
9 for (String str : beanNamesForAnnotation) {
10 Object bean = run.getBean(str);
11
12 //处理被AOP关照了的Controller
13 while (AopUtils.isAopProxy(bean)) {
14 try {
15 bean = ((Advised) bean).getTargetSource().getTarget();
16 } catch (Exception e) {
17 throw new RuntimeException("get target bean failed", e);
18 }
19 }
20
21 Class<?> forName = bean.getClass();
22 RequestMapping declaredAnnotation = forName.getAnnotation(RequestMapping.class);
23 if (declaredAnnotation != null) {
24 //获取类URL
25 String urlStarts = declaredAnnotation.value()[0];
26 //处理方法URL
27 if(urlStarts == null) {
28 urlStarts = "/"+str+"/";
29 }
30 if(!urlStarts.startsWith("/")) {//处理前缀
31 urlStarts = "/"+urlStarts;
32 }
33 if(!urlStarts.endsWith("/")) {//处理后缀
34 urlStarts = urlStarts+"/";
35 }
36 for (Method method : forName.getDeclaredMethods()) {
37 //过滤没有添加 @IgnoreLogin的请求
38 IgnoreLogin ignoreLogin = method.getAnnotation(IgnoreLogin.class);
39 if(ignoreLogin == null) {continue; }
40 //获取方法URL
41 String urlEnd = "".intern();
42 for(;;) {// 暂时就这些,需要再加
43 RequestMapping requestMapping = method.getAnnotation(RequestMapping.class);
44 if (requestMapping != null) {
45 urlEnd = requestMapping.value()[0];
46 break;
47 }
48 GetMapping getMapping = method.getAnnotation(GetMapping.class);
49 if (getMapping != null) {
50 urlEnd = getMapping.value()[0];
51 break;
52 }
53 PostMapping postMapping = method.getAnnotation(PostMapping.class);
54 if (postMapping != null) {
55 urlEnd = postMapping.value()[0];
56 break;
57 }
58 PutMapping putMapping = method.getAnnotation(PutMapping.class);
59 if (putMapping != null) {
60 urlEnd = putMapping.value()[0];
61 break;
62 }
63 DeleteMapping deleteMapping = method.getAnnotation(DeleteMapping.class);
64 if (deleteMapping != null) {
65 urlEnd = deleteMapping.value()[0];
66 break;
67 }
68 }
69 //处理方法URL
70 if(urlEnd == null) {
71 urlEnd = method.getName();
72 }
73 if(urlEnd.startsWith("/")) {//处理前缀
74 urlEnd = urlEnd.substring(1);
75 }
76 //处理 urlEnd 的 {} 不考虑 {123}id 的情况
77 if(urlEnd.indexOf("{")>=0) {
78 String[] split = urlEnd.split("/");
79 for (String s : split) {
80 if(s.startsWith("{")) {
81 s = "*";
82 }
83 }
84 urlEnd = String.join("/",split);
85 }
86 //存入请求忽略列表
87 if(StringUtils.isEmpty(properties.getAnonUris())) {
88 properties.setAnonUris(urlStarts+urlEnd);
89 } else {
90 properties.setAnonUris(properties.getAnonUris()+StringConstant.COMMA+urlStarts+urlEnd);
91 }
92 }
93 }
94 }
95 }
代码如下
从上下文中获取所有的原生controller的更多相关文章
- 在ASP.NET MVC 中获取当前URL、controller、action 、参数
URL的获取很简单,ASP.NET通用:[1]获取 完整url (协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [2]获取 虚拟目录名 ...
- 在ASP.NET MVC 中获取当前URL、controller、action
一.URL的获取很简单,ASP.NET通用: [1]获取 完整url (协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [2]获取 虚拟 ...
- Asp.Net_Mvc_获取当前Url、Controller、Action
一.URL的获取很简单,ASP.NET通用: [1]获取 完整url (协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [2]获取 虚拟 ...
- 在ASP.NET MVC 中获取当前URL、controller、action(转)
URL的获取很简单,ASP.NET通用: [1]获取 完整url (协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [2]获取 虚拟目录 ...
- 如何在ASP.NET MVC 中获取当前URL、controller、action
一.URL的获取很简单,ASP.NET通用: [1]获取 完整url (协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [2]获取 虚拟 ...
- Spring MVC 学习笔记3 - 利用Default Annotation 模式获取请求,使Controller与View对应,并传值。
1. WEB-INF/web.xml 这里定义了获取请求后,执行的第一步.抓取请求. <servlet> <servlet-name>appServlet</servle ...
- SpringMVC项目中获取所有URL到Controller Method的映射
Spring是一个很好很强大的开源框架,它就像是一个容器,为我们提供了各种Bean组件和服务.对于MVC这部分而言,它里面实现了从Url请求映射控制器方法的逻辑处理,在我们平时的开发工作中并不需要太多 ...
- 获取当前最上层controller
- (UIViewController *)topViewController { UIViewController *resultVC; resultVC = [self _topViewContr ...
- 白话学习MVC(五)Controller的激活
一.概述 在此系列开篇的时候介绍了MVC的生命周期 , 对于请求的处理,都是将相应的类的方法注册到HttpApplication事件中,通过事件的依次执行从而完成对请求的处理.对于MVC来说,请求是先 ...
随机推荐
- dos 之 for循环(小“病毒”)
需求: 1.自动在D盘下创建test2019文件夹: 2.自动在test2019下面创建100个文件,并写入"这是文件几的内容!": 3.自动打开100个CMD运行窗口(保持打开状 ...
- Shell中 heredoc 内容转义
1.在$符号前面加反斜杠,如: cat > test.sh <<EOF \$test EOF 如果不加,将转成实际的值. 2.给EOF加个双引号,如: cat > test.s ...
- centos7 单用户模式修改root密码
1. 在虚拟机重启客户机后.会出现下面进入界面.按e键 2.按了e键后,会出现下面的界面.此时按↓键.找到linux16 3.将光标移动到UTF-8后面,添加init=/bin/sh,并按 ctrl ...
- 5大最新云原生镜像构建工具全解析,3个来自Google,你了解几个?
1云原生大背景下的镜像构建在分享开始,我想先跟大家简单聊一下云原生,可能不会详细展开,而是带领大家了解一下云原生对镜像构建方面的影响.第一,在接触云原生相关的技术时,无论是要解决开发.测试环境的问题, ...
- Amazon EKS 中 EFS 持久性存储
作者:SRE运维博客 博客地址:https://www.cnsre.cn/ 文章地址:https://www.cnsre.cn/posts/220110850573/ 相关话题:https://www ...
- 百度地图BMap实现在行政区域内做标注
使用环境 vue bmap.js element-ui 页面展示 前提步骤 在index中引入百度地图提供的js库 在使用的vue页面中实例化地图 <!-- 给id随便起给名字 --> & ...
- 【Java】toString
toString 当我们输出一个对象的引用时,实际上就是调用当前对象的toString() Object类中toString()的定义: public String toString() { retu ...
- 微信小程序云开发指南
一.初识云开发 官方文档 小程序·云开发是微信团队联合腾讯云推出的专业的小程序开发服务. 开发者可以使用云开发快速开发小程序.小游戏.公众号网页等,并且原生打通微信开放能力. 开发者无需搭建服务器,可 ...
- 【源码阅读】vm-insert与vm-storage之间的通讯
先说结论 vm-insert与vm-storage之间采用极其简单的通讯协议 对于简单的场景,越简单性能越高 vm-insert连接到vm-storage后,先发送字符串vminsert.02,vm- ...
- sort排序出现安卓与苹果系统排序不一致问题
sort排序出现安卓与苹果系统排序不一致问题