Spring Boot配置攔截器及實(shí)現(xiàn)跨域訪(fǎng)問(wèn)的方法
攔截器功能強(qiáng)大,能夠深入方法前后,常應(yīng)用于日志記錄、權(quán)限檢查和性能檢測(cè)等,幾乎是項(xiàng)目中不可或缺的一部分,本文就來(lái)實(shí)現(xiàn)Spring Boot自定義攔截器的配置。
理論指導(dǎo)
問(wèn):Spring Boot怎么配置攔截器?
答:配置一個(gè)攔截器需要兩步完成。
- 自定義攔截器,實(shí)現(xiàn)HandlerInterceptor這個(gè)接口。這個(gè)接口包括三個(gè)方法,preHandle是請(qǐng)求執(zhí)行前執(zhí)行的,postHandler是請(qǐng)求結(jié)束執(zhí)行的,但只有preHandle方法返回true的時(shí)候才會(huì)執(zhí)行,afterCompletion是視圖渲染完成后才執(zhí)行,同樣需要preHandle返回true,該方法通常用于清理資源等工作。
- 注冊(cè)攔截器。 作用是確定攔截器和攔截的URL。需要繼承WebMvcConfigurationSupport并重寫(xiě)addInterceptor方法,WebMvcConfigureAdapter已經(jīng)過(guò)時(shí)了??!
代碼實(shí)現(xiàn)
目錄結(jié)構(gòu):
具體代碼:
MyInterceptor.java
public class MyInterceptor implements HandlerInterceptor { /** * preHandle在執(zhí)行Controller之前執(zhí)行,返回true,則繼續(xù)執(zhí)行Contorller * 返回false則請(qǐng)求中斷。 */ @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { //只有返回true才會(huì)繼續(xù)向下執(zhí)行,返回false取消當(dāng)前請(qǐng)求 long startTime = System.currentTimeMillis(); httpServletRequest.setAttribute("startTime", startTime); return true; } /** * postHandle是在請(qǐng)求執(zhí)行完,但渲染ModelAndView返回之前執(zhí)行 */ @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { long startTime = (Long) httpServletRequest.getAttribute("startTime"); long endTime = System.currentTimeMillis(); long executeTime = endTime - startTime; StringBuilder sb = new StringBuilder(1000); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date = simpleDateFormat.format(new Date()); sb.append("-----------------------").append(date).append("-------------------------------------\n"); sb.append("URI : ").append(httpServletRequest.getRequestURI()).append("\n"); sb.append("CostTime : ").append(executeTime).append("ms").append("\n"); sb.append("-------------------------------------------------------------------------------"); System.out.println(sb.toString()); } /** * afterCompletion是在整個(gè)請(qǐng)求執(zhí)行完畢后執(zhí)行 */ @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { } }
RegisterInterceptor.java
/** * 繼承WebMvcConfigurationSupport繼承并重寫(xiě)addInterceptor方法用于注冊(cè)攔截器 * WebMvcConfigureAdapter已經(jīng)過(guò)時(shí)了??! */ @Configuration public class RegisterInterceptor extends WebMvcConfigurationSupport { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); super.addInterceptors(registry); } }
攔截效果
更新
跨域訪(fǎng)問(wèn)
由于JavaScript同源策略,凡是發(fā)送請(qǐng)求url的協(xié)議、域名、端口三者之間任意一與當(dāng)前頁(yè)面地址不同即為跨域。具體的看下表
URL
|
說(shuō)明
|
是否允許通信
|
http://www.a.com/a.js
http://www.a.com/b.js
|
同一域名下
|
允許
|
http://www.a.com/lab/a.js
http://www.a.com/script/b.js
|
同一域名下不同文件夾
|
允許
|
http://www.a.com:8000/a.js
http://www.a.com/b.js
|
同一域名,不同端口
|
不允許
|
http://www.a.com/a.js
https://www.a.com/b.js
|
同一域名,不同協(xié)議
|
不允許
|
http://www.a.com/a.js
http://70.32.92.74/b.js
|
域名和域名對(duì)應(yīng)ip
|
不允許
|
http://www.a.com/a.js
http://script.a.com/b.js
|
主域相同,子域不同
|
不允許
|
http://www.a.com/a.js
http://a.com/b.js
|
同一域名,不同二級(jí)域名(同上)
|
不允許(cookie這種情況下也不允許訪(fǎng)問(wèn))
|
http://www.cnblogs.com/a.js
http://www.a.com/b.js
|
不同域名
|
不允許
|
上面代碼是可以實(shí)現(xiàn)攔截器基本功能,但是這樣是不可以跨域訪(fǎng)問(wèn)的,前端請(qǐng)求接口會(huì)有報(bào)錯(cuò):XMLHttpRequest cannot loadhttp://xxx/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
解決方案是設(shè)置請(qǐng)求頭Access-Control-Allow-Origin為“*”或者設(shè)置為和request相同的Origin。
①在攔截器中添加一個(gè)設(shè)置請(qǐng)求頭的方法。
public void crossDomain(HttpServletRequest request, HttpServletResponse response) { response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); response.setHeader("Access-Control-Allow-Credentials", "true"); }
②在preHandle中調(diào)用這個(gè)方法。
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { crossDomain(request, response); long startTime = System.currentTimeMillis(); request.setAttribute("startTime", startTime); return true; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用webmagic實(shí)現(xiàn)爬蟲(chóng)程序示例分享
這篇文章主要介紹了使用webmagic實(shí)現(xiàn)爬蟲(chóng)程序示例,需要的朋友可以參考下2014-04-04idea運(yùn)行程序報(bào)錯(cuò)java程序包org.junit不存在解決辦法
這篇文章主要給大家介紹了關(guān)于idea運(yùn)行程序報(bào)錯(cuò)java程序包org.junit不存在的解決辦法, 當(dāng)出現(xiàn)程序包org.junit不存在的問(wèn)題時(shí),可以通過(guò)使用適當(dāng)?shù)腏Unit版本、添加依賴(lài)或重新下載程序包等方式進(jìn)行解決,需要的朋友可以參考下2024-02-02springboot?aop里的@Pointcut()的配置方式
這篇文章主要介紹了springboot?aop里的@Pointcut()的配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11SpringBoot環(huán)境屬性占位符解析和類(lèi)型轉(zhuǎn)換方式
這篇文章主要介紹了SpringBoot環(huán)境屬性占位符解析和類(lèi)型轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11SpringBoot接口數(shù)據(jù)加解密實(shí)戰(zhàn)記錄
現(xiàn)今對(duì)于大多數(shù)公司來(lái)說(shuō),信息安全工作尤為重要,下面這篇文章主要給大家介紹了關(guān)于SpringBoot接口數(shù)據(jù)加解密的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07