在搞 Spring Security 的时候遇到了一个小坑,就是静态资源加载的问题。

当我们继承了 WebSecurityConfigurerAdapter的时候,会去重写几个方法。去设定我们自己要过滤的路径或者是权限的一些规则。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
CustomUserService customUserService; @Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(customUserService).passwordEncoder(new BCryptPasswordEncoder());
} @Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/global/**");
} @Override
protected void configure(HttpSecurity http) throws Exception { http
// 开始请求权限配置
.authorizeRequests()
// 我们指定任何用户都可以访问多个URL的模式。
// 任何用户都可以访问以"/resources/","/signup", 或者 "/about"开头的URL。
// .antMatchers("/global/**","/static/**").permitAll()
// 请求匹配 /admin/** 只拥有 ROLE_ADMIN 角色的用户可以访问
.antMatchers("/admin/**").hasRole("ADMIN")
// 请求匹配 /user/** 拥有 ROLE_ADMIN 和 ROLE_USER 的角色用户都可以访问
.antMatchers("/user/**").hasAnyRole("ADMIN", "USER")
// 任何以"/db/" 开头的URL需要同时具有 "ROLE_ADMIN" 和 "ROLE_DBA"权限的用户才可以访问。
// 和上面一样我们的 hasRole 方法也没有使用 "ROLE_" 前缀。
// .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
// 其余所有的请求都需要认证后才可以访问
.anyRequest().authenticated().and().formLogin()
// 登陆界面;默认登陆成功后的界面(不起作用);默认登陆失败的界面;表单提交地址
.loginPage("/login").defaultSuccessUrl("/index.html").failureUrl("/login?error=true")
// 默认用户名键值,默认密码键值
.usernameParameter("username").passwordParameter("password").permitAll().and().rememberMe()
.tokenValiditySeconds(1209600).key("rememberme");
// .and()
// .logout().logoutUrl("").logoutSuccessUrl("/index.html").permitAll();
} }

在一般来看来,我设置了


// 任何用户都可以访问以"/resources/","/signup", 或者 "/about"开头的URL。
.antMatchers("/global/**","/static/**").permitAll()

或者是


@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/global/**");
}

之后应该没有什么问题,就应该可以访问到了我们的资源。可是当你运行起demo之后,你会发现,世界并不是你想象的那个样子。你还太年轻。

你所要的静态资源还是加载不出来。后来发现,我们还需要去配置一下 SpringMVC 里的 addResourceHandlers 方法。


@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport { @Override
protected void addViewControllers(ViewControllerRegistry registry) {
// TODO Auto-generated method stub
// 注册访问 /login 转向 page-login.html 页面
registry.addViewController("/login").setViewName("page-login.html");
super.addViewControllers(registry);
} @Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
// TODO Auto-generated method stub
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
super.addResourceHandlers(registry);
}
}

看起来,这次应该就可以了吧。 Run ...

可是还是太年轻。依旧没有加载到资源。

这个,这个就有点凌乱了。。。。

过了好久好久好久,睡了一觉起来。

原来是HTML出了问题。对,没有听错是 HTML 出了问题。

在加载 css 或者是 js 资源的时候,我们要写的更加标准一些。


<link href="/global/css/style.css" rel="stylesheet" type="text/css" /> <script src="/global/js/custom.min.js" type="text/javascript"></script>

而不是


<link href="/global/css/style.css"/> <script src="/global/js/custom.min.js"></script>

Spring Security 静态资源访问的更多相关文章

  1. Spring Security静态资源访问

    在使用Spring Security时要求所有请求都需要授权访问,此时会定义过滤规则如下 protected void configure(HttpSecurity http) throws Exce ...

  2. Spring Boot 静态资源访问原理解析

    一.前言 springboot配置静态资源方式是多种多样,接下来我会介绍其中几种方式,并解析一下其中的原理. 二.使用properties属性进行配置 应该说 spring.mvc.static-pa ...

  3. 7.Spring MVC静态资源访问

    在SpringMVC中常用的就是Controller与View.但是我们常常会需要访问静态资源,如html,js,css,image等. 默认的访问的URL都会被DispatcherServlet所拦 ...

  4. springboot配置spring security 静态资源不能访问

    在springboot整合spring security 过程中曾遇到下面问题:(spring boot 2.0以上版本   spring security 5.x    (spring  secur ...

  5. Spring MVC静态资源访问

    最近在学习servlet的时候发现自己不能访问到css和js, 于是google一番学到不少方法加载,总结如下: 1.对于Spring MVC, 由于我们截获了所有请求<url-pattern& ...

  6. spring mvc静态资源访问的配置

    如果我们使用spring mvc来做web访问请求的控制转发,那么默认所有访问都将被DispatcherServlet独裁统治.比如我现在想访问的欢迎页index.html根本无需任何业务逻辑处理,仅 ...

  7. spring mvc官网下最新jar搭建框架-静态资源访问处理-注解-自动扫描

    1.从官网下载spring相关jar http://spring.io/projects 点击SPRING FRAMEWORK

  8. 【spring】静态资源的访问受限解决方法

    前言 我们知道在整合spring mvc框架的时候需要在web.xml中配置一个servlet 代码如下 <!--spring mvc 的DispatcherServlet--> < ...

  9. Spring MVC 使用介绍(十一)—— 跨域与静态资源访问

    一.跨域 服务端须在响应中添加相应响应头,从而允许跨域,具体可通过 public class CorsFilter extends OncePerRequestFilter { @Override p ...

随机推荐

  1. Nginx教程(6) 动静分离架构

    一.原理 Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离.严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx 处理静态页面,To ...

  2. [CPP] Big Three

    前言 上一篇攻略中,我们已经充分理解了不带指针的类的设计原则,并且还从标准库设计大师的作品里收获了不少功力.而这一篇攻略,将继续完成基于对象的类的关卡,解决这一关的最后一个问题,那就是带指针的类.在这 ...

  3. C#、OC递归锁

    做ios也有1年了,C#的东西有些都忘记了,最近几天也打算重温一下,不能学了ios把C#给抛弃了,两者都要抓,一精多专.目前C#只是重温,重点是web这块.今天主要是想起了之前做过的面试题,虽然题比较 ...

  4. 使用 Redis 实现分布式锁(转载)

    背景 在一般的分布式应用中,要安全有效地同步多服务器多进程之间的共享资源访问,就要涉及到分布式锁.目前项目是基于 Tornado 实现的分布式部署,同时也使用了 Redis 作为缓存.参考了一些资料并 ...

  5. SimpleCalendar日历插件改版

    先附上一张货真价实的效果图: 以上部分代码,为了适应我司项目的需求,原来插件源码大改(因为项目中下拉框用了select2,所以原来插件的下拉框就有问题了,在加上原来插件本身就有点问题,特别是农历 .节 ...

  6. WCF中的AddressHeader作用

    客户端发送请求给服务端,服务端根据请求消息把消息转发给对应的终结点.这里面有个消息筛选机制,如果请求消息中带有地址报头相关信息,则会用地址报头匹配当前的所有终结点.所以默认情况下客户端和服务端的地址报 ...

  7. android ConstraintLayout布局

    解析ConstraintLayout的性能优势 Android新特性介绍,ConstraintLayout完全解析 1.子控件的位置约束属性: layout_constraintRight_toLef ...

  8. Linux**系统实现log日志自动清理

    Linux系统实现log日志自动清理 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...

  9. ES6学习笔记(三)-正则扩展

    PS: 前段时间转入有道云笔记,体验非常友好,所以笔记一般记录于云笔记中,每隔一段时间,会整理一下, 发在博客上与大家一起分享,交流和学习. 以下:

  10. 有关动态规划(主要是数位DP)的一点讨论

    动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法.20世纪50年代初美国数学家在研究多阶段决策过程的优化问题时, ...