SpringBoot 1.X 版本和 SpringBoot 2.X 版本在靜態資源訪問上有一些區別,若是直接從 1.X 升級到 2.X 確定是有問題的。這篇文章就來說講這方面問題,也是項目中的坑。css
先看看項目結構,這個項目主要是開發商管理系統,包含了開發商信息,開發商訂單等模塊。主要介紹 resources 目錄,static 靜態資源目錄,包含 js,css 等。templates 目錄主要是頁面。SpringBoot 和 thymeleaf 是官方推薦,也是默認集成。html
劃掉了的都是不須要的,先來看看個人 controller 類java
package com.example.demo.controller; import com.example.demo.entity.InventoryRequestEntity; import com.example.demo.service.InventoryService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * DemoController * TODO * rockcode * 2018/6/25-9:47 */ @Controller public class DemoController { @RequestMapping("/login") public String login() { System.out.println(">>>>>>>>>>>>>>>>>>>>>login>>>>>>>>>>>>>>>>>>>>>>"); return "index"; } @RequestMapping("/") public String index() { System.out.println(">>>>>>>>>>>>>>>>>>>>>/>>>>>>>>>>>>>>>>>>>>>>"); return "index"; } }
SpringBoot 版本web
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository 2.0.3.RELEASE --> </parent>
啓動項目,先來訪問 localhost:8888/,沒問題能夠訪問 templates 下面的 index.html 頁面。這說明,SpringBoot 默認去 templates 目錄尋找頁面,再來看看頁面上腳本和樣式引入。spring
個人全部 js 和 css 都放在 resources/static 目錄下面,可是我引入的時候不用加 static 同樣成功,這說明 SpringBoot 默認去 static 目錄引入腳本和樣式,下面是成功頁面導航欄。bootstrap
關於上面端口 8888,能夠在 application.properties 裏面配置,server.port = 8888。安全
到這裏都沒有問題,可是出於安全的考慮,我必須加上攔截器,若是沒有登陸,那必須去登陸才能夠訪問。先來看看 1.5.4.RELEASE 版本攔截器。app
package com.example.demo.config; import com.example.demo.interceptor.DemoInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.*; /** * WebConfig * TODO * rockcode * 2018/7/4-10:21 */ @Configuration public class WebConfig extends WebMvcConfigurerAdapter{ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new DemoInterceptor()).addPathPatterns("/");
}
}
package com.example.demo.interceptor; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import org.springframework.web.util.UrlPathHelper; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * DemoInterceptor * TODO * rockcode * 2018/7/4-10:02 */
public class DemoInterceptor extends HandlerInterceptorAdapter { private UrlPathHelper urlPathHelper = new UrlPathHelper(); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("DemoInterceptor....驗證用戶名,密碼是否正確...."); response.sendRedirect("/login"); return true; } }
如今來訪問 localhost:8888/,攔截器會攔截 /,而後跳轉到 /login,讓其去作驗證等等事情。下面是成功界面。可是若是把版本換成 2.0.3.RELEASE,你會發現頁面變得很亂,樣式和腳本沒辦法加載進來。ide
緣由在 1.X 和 2.X 靜態資源訪問方式變了,1.X 是默認 static 目錄,可是 2.X 須要顯示去說明。spring-boot
咱們來看看 2.X 的攔截器有什麼不一樣,首先 WebMvcConfigurerAdapter 已通過時,要用 WebMvcConfigurationSupport 類,並且須要實現 addResourceHandlers 方法。
package com.example.demo.config; import com.example.demo.interceptor.DemoInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; /** * WebConfig * TODO * rockcode * 2018/7/4-10:21 */ @Configuration public class WebConfig extends WebMvcConfigurationSupport { @Override protected void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new DemoInterceptor()).addPathPatterns("/login").excludePathPatterns("/static/**"); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); } }
指定了靜態文件目錄,在頁面引用必須加上 static,例如 <link rel="stylesheet" href="static/css/bootstrap.min.css"/> 等。
這其中的緣由,能夠去看看 WebMvcConfigurationSupport 和 WebMvcConfigurerAdapter 源碼。