最近在學(xué)習(xí)SpringBoot方面的知識妒御,基本的框架已經(jīng)了解的差不多了布疙,今天在搭框架的時候姆钉,想到了一個使用場景:在一個Web平臺上,如果沒有登錄該平臺听诸,那么訪問的界面是有限的坐求,這樣我就需要做一個白名單,未登錄的用戶如果訪問的是白名單中的頁面晌梨,是可以不需要驗證其登陸的桥嗤。
這樣問題的解決思路是我需要一個List來放置我的白名單路徑,但是我有又不想將這個白名單放置在靜態(tài)變量中仔蝌,所以想到了SpringBoot支持自定義配置文件泛领,而我只要維護一個配置文件,在每次過濾器調(diào)用的時候?qū)酌麊巫x出來就可以了敛惊,這樣項目中的開發(fā)人員只要維護一個配置文件即可渊鞋,既然有了思路,那么就可以開始實現(xiàn)了瞧挤。
讀取自定義配置文件
學(xué)習(xí)過SpringBoot的朋友們應(yīng)該都知道锡宋,Spb的項目配置文件主要是application.properties,當(dāng)然你也可以自定義生產(chǎn)環(huán)境和開發(fā)環(huán)境的配置文件特恬,具體的方法可以百度执俩,這里不是討論的重點,現(xiàn)在我們討論的是在自定義的配置文件中讀取配置信息的方法:
- 創(chuàng)建配置文件
在resources/目錄下創(chuàng)建config文件夾癌刽,并在該文件夾下創(chuàng)建"visit_white_list.properties"文件役首。 - 填寫配置文件內(nèi)容
既然是一個白名單,那肯定用List來存放數(shù)據(jù)是最合適不過得了妒穴,配置文件中宋税,創(chuàng)建List的方法很簡單,其配置文件的內(nèi)容如下:
web.whitelist[0]=/hello
web.whitelist[1]=/hello1
web.whitelist[2]=/hello2
先不說具體的意義讼油,單從語法來看杰赛,這段代碼就是一個數(shù)組形式的定義,當(dāng)然你也可以定義字符串類型或者數(shù)字類型的屬性值矮台,這里我就不多做贅述了乏屯,現(xiàn)在進入下一步根时。
- 創(chuàng)建管理配置的實體類
其實這篇文章存在的意義就在于,1.5之后和1.5之前辰晕,管理配置的實體類是有變化的
首先我們來看看1.5之前實體類的寫法:
@ConfigurationProperties(locations = "classpath:config/visit_white_list.properties", prefix = "web")
@Component
public class WhiteListConfig {
public List<String> getWhitelist() {
return whitelist;
}
public void setWhitelist(List<String> whitelist) {
this.whitelist = whitelist;
}
private List<String> whitelist;
}
再看看1.5之后的寫法
@Component
@PropertySource(value = "classpath:config/visit_white_list.properties")
@ConfigurationProperties(prefix = "web")
public class WhiteListConfig {
public List<String> getWhitelist() {
return whitelist;
}
public void setWhitelist(List<String> whitelist) {
this.whitelist = whitelist;
}
private List<String> whitelist;
}
在@ConfigurationProperties注釋中有兩個屬性:
locations:指定配置文件的所在位置
prefix:指定配置文件中鍵名稱的前綴(我這里配置文件中所有鍵名都是以web.開頭)
使用@Component是讓該類能夠在其他地方被依賴使用蛤迎,即使用@Autowired注釋來創(chuàng)建實例。
但是1.5之后取消了 @ConfigurationProperties 的 locations屬性含友,所以在1.5之后 需要加入@PropertySource 屬性來指定自定義配置文件的相對路徑替裆,以便系統(tǒng)加載。
- 創(chuàng)建過濾器
過濾器的內(nèi)容:
/**
* 使用注解標(biāo)注過濾器
*
* @version v.0.1
* @WebFilter將一個實現(xiàn)了javax.servlet.Filter接口的類定義為過濾器 屬性filterName聲明過濾器的名稱, 可選
* 屬性urlPatterns指定要過濾的URL模式,也可使用屬性value來聲明.(指定要過濾的URL模式是必選屬性)
*/
@WebFilter(filterName = "AuthFilter", urlPatterns = "/*")
public class AuthFilter implements Filter {
@Autowired
private WhiteListConfig myWebConfig;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("訪問路徑權(quán)限過濾器初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("訪問路徑權(quán)限開始執(zhí)行過濾器");
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession(true);
String usercode = (String) request.getRemoteUser();// 登錄人
String user_role = (String) session.getAttribute("role");//登錄人角色
String url = request.getRequestURI();
if (usercode == null || "".equals(usercode) || user_role == null || "".equals(user_role)) {
//判斷獲取的路徑不為空且不是訪問登錄頁面或執(zhí)行登錄操作時跳轉(zhuǎn)
if (!myWebConfig.getWhitelist().contains(url) &&url != null && !url.equals("") && (url.indexOf("Login") < 0 && url.indexOf("login") < 0)) {
//無權(quán)限時跳轉(zhuǎn)到登錄界面
response.sendRedirect(request.getContextPath() + "/login.dhcc");
return;
}
}
filterChain.doFilter(servletRequest, servletResponse);
return;
}
@Override
public void destroy() {
System.out.println("訪問路徑權(quán)限過濾器銷毀");
}
}
使用
@Autowired
private WhiteListConfig myWebConfig;
獲取到白名單配置文件并獲取其list對象來判斷當(dāng)前Url是否在白名單范圍內(nèi)即可窘问。
總結(jié)
網(wǎng)上查了很多資料辆童,關(guān)于SpringBoot讀取自定義配置文件的方法都是屬于1.5之前的讀取方式,而我的項目屬于1.5之后的惠赫,于是搜了很多資料才找到1.5之后的配置方式把鉴,在此分享給大家,希望大家少走彎路吧儿咱。