
AbstractAccessDecisionManager的子类使用了decide这个方法,你需要看AbstractAccessDecisionManager里面对于voter的结果如何处理的
比如UnanimousBasedclass
```
for (ConfigAttribute attribute : attributes) {
singleAttributeListset(0, attribute);
for (AccessDecisionVoter voter : getDecisionVoters()) {
int result = votervote(authentication, object, singleAttributeList);
if (loggerisDebugEnabled()) {
loggerdebug("Voter: " + voter + ", returned: " + result);
}
switch (result) {
case AccessDecisionVoterACCESS_GRANTED:
grant++;
break;
case AccessDecisionVoterACCESS_DENIED:
throw new AccessDeniedException(messagesgetMessage(
"AbstractAccessDecisionManageraccessDenied",
"Access is denied"));
default:
abstain++;
break;
}
}
}
// To get this far, there were no deny votes
if (grant > 0) {
return;
}
```
主要看这边处理的
在上篇文章《SpringBoot应用启动原理(一) 将启动脚本嵌入jar》中介绍了SpringBoot如何将启动脚本与Runnable Jar整合为Executable Jar的原理,使得生成的jar/war文件可以直接启动
本篇将介绍SpringBoot如何扩展URLClassLoader实现嵌套jar的类(资源)加载,以启动我们的应用。
首先,从一个简单的示例开始
buildgradle
WebAppjava
执行 gradle build 构建jar包,里面包含 应用程序 、 第三方依赖 以及SpringBoot 启动程序 ,其目录结构如下
查看MANIFESTMF的内容(MANIFESTMF文件的作用请自行GOOGLE)
可以看到,jar的启动类为 orgspringframeworkbootloaderJarLauncher ,而并不是我们的 commanerfanSpringBoottheoryWebApp ,应用程序入口类被标记为了Start-Class
jar启动并不是通过应用程序入口类,而是通过JarLauncher代理启动。其实SpringBoot拥有3中不同的Launcher: JarLauncher 、 WarLauncher 、 PropertiesLauncher
SpringBoot使用Launcher代理启动,其最重要的一点便是可以自定义ClassLoader,以实现对jar文件内(jar in jar)或其他路径下jar、class或资源文件的加载
关于ClassLoader的更多介绍可参考 《深入理解JVM之ClassLoader》
SpringBoot抽象了Archive的概念,一个Archive可以是jar(JarFileArchive),可以是一个文件目录(ExplodedArchive),可以抽象为统一访问资源的逻辑层。
上例中,spring-boot-theory-100jar既为一个JarFileArchive,spring-boot-theory-100jar!/BOOT-INF/lib下的每一个jar包也是一个JarFileArchive
将spring-boot-theory-100jar解压到目录spring-boot-theory-100,则目录spring-boot-theory-100为一个ExplodedArchive
按照定义,JarLauncher可以加载内部 /BOOT-INF/lib 下的jar及 /BOOT-INF/classes 下的应用class
其实JarLauncher实现很简单
其主入口新建了JarLauncher并调用父类Launcher中的launch方法启动程序
再创建JarLauncher时,父类ExecutableArchiveLauncher找到自己所在的jar,并创建archive
在Launcher的launch方法中,通过以上archive的getNestedArchives方法找到/BOOT-INF/lib下所有jar及/BOOT-INF/classes目录所对应的archive,通过这些archives的url生成LaunchedURLClassLoader,并将其设置为线程上下文类加载器,启动应用
至此,才执行我们应用程序主入口类的main方法,所有应用程序类文件均可通过/BOOT-INF/classes加载,所有依赖的第三方jar均可通过/BOOT-INF/lib加载
在分析LaunchedURLClassLoader前,首先了解一下URLStreamHandler
java中定义了URL的概念,并实现多种URL协议(见 URL ) > 1、问题 在前后端分离的环境下进行项目开发,前台通过url请求后台的接口时,需要进行跨域,如果后台项目有很多 Controller 控制器,需要在每个 Controller 控制器的类上都添加 @CrossOrigin 跨域注解,这样就会显得重复。在Spring Boot项目中,可以配置全局跨域。 2、解决方法 创建一个跨域的配置类 CorsConfigjava ,然后通过 @Configuration 注解将该类交给Spring容器进行管理和生效。 如果您有什么好的想法与方法,欢迎在评论区留言,我们一起讨论~
query params就是最简单的问号传参方式,而spring接受参数方式有以下几种不需要额外第三方包。
前端传参:
后台接收:
统一资源定位符(又称URL)是一种资源命名或定位格式,用于指定或寻址资源。 URL在Web上非常流行,在Web上使用URL格式寻址或标识网站和Web资源。
2000年Roy Fielding博士在其博士论文中提出REST(Representational State Transfer)风格的软件架构模式后,REST就基本上迅速取代了复杂而笨重的SOAP,成为Web API的标准了。
RESTful作为目前最流行的 API 设计规范,一定有着它独有的魅力:强大、简介、易上手。
前端传参:
后台接收:
以前的form表单和formData是ajax20( XML>
以上就是关于springboot 集成spring security后 url拦截问题全部的内容,包括:springboot 集成spring security后 url拦截问题、SpringBoot应用启动原理(二) 扩展URLClassLoader实现嵌套jar加载、Spring Boot 全局跨域配置等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)