静态资源默认存放位置

image.png
resources 目录下,static/public目录是我们的静态资源目录,直接访问该目录下的资源的映射路径不需要携带/public或者/static,直接访问即可
image.png
如果controller的映射路径和静态资源路径冲突,会发生什么事情呢?

  1. package com.xiaohui.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. @Controller
  6. public class MyController {
  7. @RequestMapping("/test.png")
  8. @ResponseBody
  9. public String test(){
  10. return "controller test";
  11. }
  12. }

请求进来,先去看Controller中有没有对应的资源,如果有则,执行controller资源,如果没有,就交给静态资源处理器,静态资源处理器也没有找到,则返回404
image.png

静态资源访问前缀

默认无前缀,如果想指定静态资源前缀,可以 通过spring.mvc.static-path-pattern配置
image.png
yml配置如下
image.png
请求路径上通过 项目上下文路径+静态资源前缀+静态资源名的方式访问
image.png
指定静态资源位置
静态资源默认存放的路径为static content from a directory called /static (or /public or /resources or /META-INF/resources)
可以通过
image.png
static-locations 指定专门的静态资源路径
image.png
static-locations 指定专门的静态资源路径
image.png

springboot还支持静态资源webjars 的处理方式,就是将静态资源打成jar导入
https://www.webjars.org/
image.png
项目中导入jQuery依赖

  1. <dependency>
  2. <groupId>org.webjars</groupId>
  3. <artifactId>jquery</artifactId>
  4. <version>3.6.0</version>
  5. </dependency>

导入后,自动映射
image.png
http://localhost:8080/springboot-static-content/res/webjars/jquery/3.6.0/jquery.js
或者
http://localhost:8080/springboot-static-content/webjars/jquery/3.6.0/jquery.js
image.png

设置默认欢迎页

image.png

方式1

支持静态资源欢迎页, index.html 注意此时不能配置静态资源前缀,否则不生效
静态资源位置:
image.pngimage.png

方式2

通过controller ,定义 / 和/index映射 路径

  1. @RequestMapping(path={"/","/index"})
  2. public String welcome(){
  3. return "welcome";
  4. }

导入thymeleaf

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  4. <version>2.4.5</version>
  5. </dependency>

在templates创建一个welcome.html页面
启动项目或者访问index就会跳转到welcome.html页面

定义Favicon

定义网页的头部图标
image.png
image.png
static目录下准备一个favicon.ico的一个图片即可
image.png
浏览器默认访问favicon.ico的路径为 协议://ip:端口号/favicon.ico,所以这里不要设置项目的上下文路径
image.png

拦截器静态资源放行

定义一个登陆页面

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script type="text/javascript" src="js/test.js"></script>
  7. </head>
  8. <body>
  9. <img src="img/test.png">
  10. <form action="login">
  11. <input type="text" name="username" >
  12. <input type="submit">
  13. </form>
  14. </body>
  15. </html>

定义一个登陆controller

  1. package com.xiaohui.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.HttpRequestHandler;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.ResponseBody;
  6. import javax.servlet.http.HttpServletRequest;
  7. @Controller
  8. public class LoginController {
  9. @RequestMapping("/login")
  10. public String loginInto(String userName, HttpServletRequest request){
  11. if(null != userName && "".equals(userName)){
  12. request.getSession().setAttribute("userName",userName);
  13. return "main";
  14. }
  15. return "redirect:login.html";
  16. }
  17. }

定义一个登陆拦截器

  1. package com.xiaohui.interceptor;
  2. import org.springframework.stereotype.Component;
  3. import org.springframework.web.servlet.HandlerInterceptor;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. /**
  7. * @author hh
  8. * @date 2022/2/23 22:36
  9. * Version 1.0
  10. */
  11. @Component
  12. public class LoginInterceptor implements HandlerInterceptor {
  13. @Override
  14. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  15. Object userName = request.getSession().getAttribute("userName");
  16. //如果登录过,就放行
  17. if(null != userName){
  18. return true;
  19. }
  20. //如果没登录过,就回到登录页面,重定向
  21. response.sendRedirect("login.html");
  22. return false;
  23. }
  24. }

配置拦截器

  1. package com.xiaohui.config;
  2. import com.xiaohui.interceptor.LoginInterceptor;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  6. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  7. /**
  8. * @author hh
  9. * @date 2022/2/23 22:40
  10. * Version 1.0
  11. */
  12. @Configuration
  13. public class MyInterceptorRegist implements WebMvcConfigurer {
  14. @Autowired
  15. private LoginInterceptor loginInterceptor;
  16. @Override
  17. public void addInterceptors(InterceptorRegistry registry) {
  18. registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/login", "/login.html", "/css/**", "/js/**", "/img/**", "/font/**");
  19. }
  20. }

template下的main.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. this is main....
  9. </body>
  10. </html>