AnonymousProperties.java 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package com.backendsys.modules.common.config.security;
  2. import cn.hutool.core.convert.Convert;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.backendsys.modules.common.config.security.annotations.Anonymous;
  5. import org.apache.commons.lang3.RegExUtils;
  6. import org.springframework.beans.BeansException;
  7. import org.springframework.beans.factory.InitializingBean;
  8. import org.springframework.context.ApplicationContext;
  9. import org.springframework.context.ApplicationContextAware;
  10. import org.springframework.context.annotation.Configuration;
  11. import org.springframework.core.annotation.AnnotationUtils;
  12. import org.springframework.web.method.HandlerMethod;
  13. import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
  14. import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
  15. import java.util.ArrayList;
  16. import java.util.List;
  17. import java.util.Map;
  18. import java.util.Optional;
  19. import java.util.regex.Matcher;
  20. import java.util.regex.Pattern;
  21. import cn.hutool.core.util.ReUtil;
  22. @Configuration
  23. public class AnonymousProperties implements InitializingBean, ApplicationContextAware {
  24. private static final Pattern PATTERN = Pattern.compile("\\{(.*?)\\}");
  25. private ApplicationContext applicationContext;
  26. private List<String> urls = new ArrayList<>();
  27. public String ASTERISK = "*";
  28. @Override
  29. public void afterPropertiesSet() throws Exception {
  30. // System.out.println("afterPropertiesSet:");
  31. // 将整个项目所有的bean对象都拿出来
  32. RequestMappingHandlerMapping mapping = applicationContext.getBean(RequestMappingHandlerMapping.class);
  33. // 获取每一个方法,获取url和类与方法对应的信息
  34. Map<RequestMappingInfo, HandlerMethod> map = mapping.getHandlerMethods();
  35. // info代表每一个url对象
  36. map.keySet().forEach(info -> {
  37. // 获取类和方法
  38. HandlerMethod handlerMethod = map.get(info);
  39. // 获取方法上边的注解 替代path variable 为 *
  40. // AnnotationUtils.findAnnotation()为第三方的依赖,进行判断 一个方法上有没有注解
  41. Anonymous method = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Anonymous.class);
  42. if (method != null) {
  43. // Pattern pattern = Pattern.compile("\\{(\\w+) \\[(.+?)\\]}");
  44. // // 排除 SSE协议接口 多余的字段
  45. // String infoContent = info.toString().replace(", produces [text/event-stream]", "");
  46. // Matcher matcher = pattern.matcher(infoContent);
  47. //// System.out.println("matcher1:");
  48. //// System.out.println(matcher);
  49. //// Matcher matcher = pattern.matcher(info.toString());
  50. // if (matcher.find()) {
  51. // String url = matcher.group(2);
  52. // System.out.println("url: " + url);
  53. // urls.add(url);
  54. // }
  55. // 正则表达式,匹配第一个方括号内的内容
  56. Pattern regex = Pattern.compile("\\[(.*?)\\]");
  57. String url = ReUtil.getGroup1(regex, info.toString());
  58. if (StrUtil.isNotEmpty(url)) {
  59. // System.out.println("(@Anonymous) url: " + url);
  60. urls.add(url);
  61. }
  62. }
  63. //// ifPresent()方法就是会返回一个boolean类型值,如果对象不为空则为真,如果为空则为false
  64. // Optional.ofNullable(method).ifPresent(anonymous ->
  65. // //获取url的Set集合,一个方法可能对应多个url
  66. // info.getPatternsCondition().getPatterns()
  67. // .forEach(
  68. // url -> urls.add(RegExUtils.replaceAll(String.valueOf(url), PATTERN, ASTERISK))
  69. // ));
  70. // 获取类上边的注解, 替代path variable 为 *
  71. Anonymous controller = AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), Anonymous.class);
  72. Optional.ofNullable(controller).ifPresent(anonymous -> info.getPatternsCondition().getPatterns()
  73. .forEach(url -> urls.add(RegExUtils.replaceAll(String.valueOf(url), PATTERN, ASTERISK))));
  74. });
  75. }
  76. @Override
  77. public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  78. this.applicationContext = applicationContext;
  79. }
  80. public List<String> getUrlsList() {
  81. return urls;
  82. }
  83. public String[] getUrls() {
  84. return Convert.toStrArray(urls);
  85. }
  86. public void setUrls(List<String> urls)
  87. {
  88. this.urls = urls;
  89. }
  90. }