本來地址:Spring Boot乾貨系列:(六)靜態資源和攔截器處理
博客地址:tengj.top/javascript
本章咱們來介紹下SpringBoot對靜態資源的支持以及很重要的一個類WebMvcConfigurerAdapter。html
前面章節咱們也有簡單介紹過SpringBoot中對靜態資源的默認支持,今天詳細的來介紹下默認的支持,以及自定義擴展如何實現。java
Spring Boot 默認爲咱們提供了靜態資源處理,使用 WebMvcAutoConfiguration 中的配置各類屬性。
建議你們使用Spring Boot的默認配置方式,提供的靜態資源映射以下:git
在工程裏面路徑是這樣:
github
對應的配置文件配置以下:web
# 默認值爲 /**
spring.mvc.static-path-pattern=
# 默認值爲 classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
spring.resources.static-locations=這裏設置要指向的路徑,多個使用英文逗號隔開複製代碼
咱們能夠經過修改spring.mvc.static-path-pattern來修改默認的映射,例如我改爲/dudu/**,那運行的時候訪問 http://lcoalhost:8080/dudu/index.html 纔對應到index.html頁面。ajax
若是Spring Boot提供的Sping MVC不符合要求,則能夠經過一個配置類(註解有@Configuration的類)加上@EnableWebMvc註解來實現徹底本身控制的MVC配置。spring
固然,一般狀況下,Spring Boot的自動配置是符合咱們大多數需求的。在你既須要保留Spring Boot提供的便利,有須要增長本身的額外的配置的時候,能夠定義一個配置類並繼承WebMvcConfigurerAdapter,無需使用@EnableWebMvc註解。編程
這裏咱們提到這個WebMvcConfigurerAdapter這個類,重寫這個類中的方法可讓咱們增長額外的配置,這裏咱們就介紹幾個經常使用的。json
好比,咱們想自定義靜態資源映射目錄的話,只需重寫addResourceHandlers方法便可。
@Configuration
public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
/** * 配置靜態訪問資源 * @param registry */
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/my/**").addResourceLocations("classpath:/my/");
super.addResourceHandlers(registry);
}
}複製代碼
經過addResourceHandler添加映射路徑,而後經過addResourceLocations來指定路徑。咱們訪問自定義my文件夾中的elephant.jpg 圖片的地址爲 http://localhost:8080/my/elephant.jpg
若是你想指定外部的目錄也很簡單,直接addResourceLocations指定便可,代碼以下:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/my/**").addResourceLocations("file:E:/my/");
super.addResourceHandlers(registry);
}複製代碼
addResourceLocations指的是文件放置的目錄,addResoureHandler指的是對外暴露的訪問路徑
之前寫SpringMVC的時候,若是須要訪問一個頁面,必需要寫Controller類,而後再寫一個方法跳轉到頁面,感受好麻煩,其實重寫WebMvcConfigurerAdapter中的addViewControllers方法便可達到效果了
/** * 之前要訪問一個頁面須要先建立個Controller控制類,再寫方法跳轉到頁面 * 在這裏配置後就不須要那麼麻煩了,直接訪問http://localhost:8080/toLogin就跳轉到login.htm頁面了 * @param registry */
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/toLogin").setViewName("login");
super.addViewControllers(registry);
}複製代碼
值的指出的是,在這裏重寫addViewControllers方法,並不會覆蓋WebMvcAutoConfiguration中的addViewControllers(在此方法中,Spring Boot將「/」映射至index.html),這也就意味着咱們本身的配置和Spring Boot的自動配置同時有效,這也是咱們推薦添加本身的MVC配置的方式。
攔截器在咱們項目中常用的,這裏就來介紹下最簡單的判斷是否登陸的使用。
要實現攔截器功能須要完成如下2個步驟:
首先,自定義攔截器代碼:
package com.dudu.interceptor;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
boolean flag =true;
User user=(User)request.getSession().getAttribute("user");
if(null==user){
response.sendRedirect("toLogin");
flag = false;
}else{
flag = true;
}
return flag;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}複製代碼
這裏咱們簡單實現了根據session中是否有User對象來判斷是否登陸,爲空就跳轉到登陸頁,不爲空就經過。
接着,重寫WebMvcConfigurerAdapter中的addInterceptors方法以下:
/** * 攔截器 * @param registry */
@Override
public void addInterceptors(InterceptorRegistry registry) {
// addPathPatterns 用於添加攔截規則
// excludePathPatterns 用戶排除攔截
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/toLogin","/login");
super.addInterceptors(registry);
}複製代碼
addPathPatterns("/**")
對全部請求都攔截,可是排除了/toLogin
和/login
請求的攔截。
頁面登陸關鍵代碼
//簡單登陸操做
$("#doLogin").click(function (e) {
$.ajax({
type : "POST",
url : "/login",
data : {
"userName" : $("#userName").val(),
"password" : $("#password").val()
},
dataType : "json",
success : function(data) {
if (data.result == "1") {
window.location.href ="/learn";
} else {
alert("帳號密碼不能爲空!");
}
}
});
});複製代碼
控制器代碼:
package com.dudu.controller;
@Controller
public class LearnController {
/** *登陸操做 **/
@RequestMapping(value = "/login",method = RequestMethod.POST)
@ResponseBody
public Map<String,Object> login(HttpServletRequest request, HttpServletResponse response){
Map<String,Object> map =new HashMap<String,Object>();
String userName=request.getParameter("userName");
String password=request.getParameter("password");
if(!userName.equals("") && password!=""){
User user =new User(userName,password);
request.getSession().setAttribute("user",user);
map.put("result","1");
}else{
map.put("result","0");
}
return map;
}
@RequestMapping("/learn")
public ModelAndView index(){
List<LearnResouce> learnList =new ArrayList<LearnResouce>();
LearnResouce bean =new LearnResouce("官方參考文檔","Spring Boot Reference Guide","http://docs.spring.io/spring-boot/docs/1.5.1.RELEASE/reference/htmlsingle/#getting-started-first-application");
learnList.add(bean);
bean =new LearnResouce("官方SpriongBoot例子","官方SpriongBoot例子","https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples");
learnList.add(bean);
bean =new LearnResouce("龍國學院","Spring Boot 教程系列學習","http://www.roncoo.com/article/detail/125488");
learnList.add(bean);
bean =new LearnResouce("嘟嘟MD獨立博客","Spring Boot乾貨系列 ","http://tengj.top/");
learnList.add(bean);
bean =new LearnResouce("後端編程嘟","Spring Boot教程和視頻 ","http://www.toutiao.com/m1559096720023553/");
learnList.add(bean);
bean =new LearnResouce("程序猿DD","Spring Boot系列","http://www.roncoo.com/article/detail/125488");
learnList.add(bean);
bean =new LearnResouce("純潔的微笑","Sping Boot系列文章","http://www.ityouknow.com/spring-boot");
learnList.add(bean);
bean =new LearnResouce("CSDN——小當博客專欄","Sping Boot學習","http://blog.csdn.net/column/details/spring-boot.html");
learnList.add(bean);
bean =new LearnResouce("梁桂釗的博客","Spring Boot 揭祕與實戰","http://blog.csdn.net/column/details/spring-boot.html");
learnList.add(bean);
bean =new LearnResouce("林祥纖博客系列","從零開始學Spring Boot ","http://412887952-qq-com.iteye.com/category/356333");
learnList.add(bean);
ModelAndView modelAndView = new ModelAndView("/template");
modelAndView.addObject("learnList", learnList);
return modelAndView;
}
}複製代碼
這樣訪問的時候,若是未登陸就會跳轉到login.html頁面,而訪問http://localhost:8080/toLogin 和http://localhost:8080/login 不會被攔截。
靜態資源跟攔截器在平時項目中常常用到,弄懂如何處理是頗有用的。今天就到此爲止,下一篇未來介紹一下項目中如何使用日誌。
想要查看更多Spring Boot乾貨教程,可前往:Spring Boot乾貨系列總綱
一直以爲本身寫的不是技術,而是情懷,一篇篇文章是本身這一路走來的痕跡。靠專業技能的成功是最具可複製性的,但願個人這條路能讓你少走彎路,但願我能幫你抹去知識的蒙塵,但願我能幫你理清知識的脈絡,但願將來技術之巔上有你也有我,但願大爺你看完打賞點零花錢給我。
訂閱博主微信公衆號:嘟爺java超神學堂(javaLearn)三大好處: