一、背景
在开发 Web 应用时,我们通常需要使用 SpringBoot 和 SpringSecurity 进行开发,其中 SpringSecurity 用于处理安全相关的逻辑。在使用 SpringSecurity 进行开发时,有时候我们需要对某些 URL 进行访问控制,但是又不希望对一些静态资源进行拦截,否则会影响应用性能。
本篇文章将为大家介绍如何使用 SpringBoot 和 SpringSecurity 实现不拦截静态资源的功能。
二、实现方法
在 SpringSecurity 中,我们可以使用 WebSecurityConfigurerAdapter
类来配置 SpringSecurity,其中的 configure()
方法可以用来配置在不同场景下的访问控制规则。
在实现不拦截静态资源的功能时,我们可以在 configure()
方法中添加 WebSecurity
配置,并将静态资源的路径添加到白名单中,如下所示:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers("/static/**");
}
}
在上面的示例中,我们将 /static/**
路径下的静态资源添加到白名单中,这样 SpringSecurity 就不会对该路径下的资源进行拦截。
除了上面的配置外,我们还需要在 SpringBoot 的配置文件中添加静态资源的路径,如下所示:
spring:
resources:
static-locations: classpath:/static/
在上面的示例中,我们将静态资源的路径设置为 classpath:/static/
,这样 SpringBoot 就会将该目录下的静态资源作为文件夹暴露出来。
三、示例演示
下面有两个简单的示例,用来演示如何使用 SpringBoot 和 SpringSecurity 实现不拦截静态资源的功能。
示例一
1. 创建 SpringBoot 项目
首先我们需要创建一个 SpringBoot 项目,可以使用 Spring Initializr 来创建。在创建项目时需要添加以下依赖:
- Spring Web
- Thymeleaf
- Spring Security
2. 配置 SpringSecurity
我们在 SpringSecurity 的配置文件中添加 WebSecurity
配置,代码如下所示:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers("/static/**");
}
}
3. 创建静态资源
我们在 src/main/resources/static/
目录下创建一个静态资源文件 test.html
,代码如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test Page</title>
</head>
<body>
<h1>Test Page</h1>
</body>
</html>
4. 创建控制器
我们创建一个简单的控制器,用于访问静态资源,代码如下所示:
@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "index";
}
@GetMapping("/test")
public String test() {
return "test";
}
}
5. 创建首页
我们在 src/main/resources/templates/
目录下创建一个首页文件 index.html
,代码如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Home Page</title>
</head>
<body>
<h1>Home Page</h1>
<a href="/test">Test Page</a>
</body>
</html>
6. 运行项目
运行项目后,访问 http://localhost:8080/
可以看到首页,点击链接可以跳转到 test.html
页面。在页面上右键,选择 "查看页面源代码" 可以看到静态资源的源代码,证明静态资源没有被 SpringSecurity 拦截。
示例二
1. 创建 SpringBoot 项目
首先我们需要创建一个 SpringBoot 项目,可以使用 Spring Initializr 来创建。在创建项目时需要添加以下依赖:
- Spring Web
- Spring Security
2. 配置 SpringSecurity
我们在 SpringSecurity 的配置文件中添加 WebSecurity
配置,代码如下所示:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers("/img/**", "/css/**", "/js/**");
}
}
在上面的示例中,我们将 img/
、css/
、js/
目录下的静态资源添加到白名单中,这样 SpringSecurity 就不会对这些路径下的资源进行拦截。
3. 创建静态资源目录
我们在项目根目录下创建一个 static/
目录,并在该目录下创建如下目录:
static
├── css
│ └── style.css
├── img
│ └── logo.png
└── js
└── script.js
css/
目录下的 style.css
文件内容如下所示:
body {
font-size: 20px;
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
color: #333;
padding: 20px;
background-color: #fff;
}
h1 {
font-size: 36px;
margin-bottom: 20px;
}
img/
目录下的 logo.png
文件是一张图片。
js/
目录下的 script.js
文件内容如下所示:
(function () {
console.log('Hello, world!');
})();
4. 创建控制器
我们创建一个简单的控制器,用于访问静态资源,代码如下所示:
@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "index";
}
}
5. 创建首页
我们在 src/main/resources/templates/
目录下创建一个首页文件 index.html
,代码如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Home Page</title>
<link href="/css/style.css" rel="stylesheet">
<script src="/js/script.js"></script>
</head>
<body>
<h1>Home Page</h1>
<img src="/img/logo.png" alt="Logo">
</body>
</html>
在上面的代码中,我们通过 href
和 src
属性来引入静态资源,并将其路径设置为绝对路径。由于我们在 SpringSecurity 的配置文件中将 img/
、css/
、js/
目录下的静态资源添加到白名单中,所以这些资源不会被 SpringSecurity 拦截。
6. 运行项目
运行项目后,访问 http://localhost:8080/
可以看到首页,页面中的静态资源可以正常加载。在页面上右键,选择 "查看页面源代码" 可以看到静态资源的链接,证明静态资源没有被 SpringSecurity 拦截。
四、总结
在本篇文章中,我们介绍了如何使用 SpringBoot 和 SpringSecurity 实现不拦截静态资源的功能,并且给出了两个示例来演示该功能的实现过程。
总的来说,实现这个功能非常简单,只需要在 SpringSecurity 的配置文件中将静态资源的路径添加到白名单中,并在 SpringBoot 的配置文件中添加静态资源的路径即可。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot+SpringSecurity 不拦截静态资源的实现 - Python技术站