1瀏覽器跨域訪問
1.1瀏覽器的同源策略
- 同源策略阻止從一個域加載的腳本去獲取另一個域上的資源。
- 只要協議、域名、端口有任何一-個不同,都被當作是不同的域。
- 瀏覽器Console看到Access-Control-Allow-Origin就代表跨域了。
- 示例
- HTML種允許跨域標籤
- <img> -顯示遠程圖片
- <script> -加載遠程JS
- <link> -加載遠程CSS
1.2跨域的解決措施
- CORS跨域資源訪問
- CORS是一 種機制,使用額外的HTTP頭通知瀏覽器可以訪問其他域。
- URL響應頭包含Access-Control-*指明請求允許跨域。
- SpringMVC解決跨域訪問
- @CrossOrigin Controller跨域註解(只針對一個Controller有效,多個控制器需要多此添加)
-
/** * CrossOrigin 爲跨域請求做準備 origins中是允許跨域訪問的前端網址 ;maxAge=3600 是 緩存非清單請求(PUT/DELETE、擴展標準請求) * 中的預檢請求進行緩存 單位是秒。此處註釋的是1小時 降低服務器壓力,因爲緩存之後,相同的預檢請求可以省略 */ @CrossOrigin(origins = {"http://localhost:8080","http://127.0.0.1:8080"},maxAge = 3600) @RestController @RequestMapping("/restful") public class RestfulController { @GetMapping("/request") public String doGetRequest(){ return "{\"message\":\"返回查詢結果\"}"; } }
- <mvc:cors> SrpingMvc全局跨域配置(applicationContext.xml中配置)
-
<!-- 添加跨域請求--> <mvc:cors> <mvc:mapping path="/restful/**" allowed-origins="http://127.0.0.1:8080,http://localhost:8080" max-age="3600"/> </mvc:cors>
-
2攔截器(Interceptor)
2.1基礎
- 攔截器(Interceptor)用於對URL請求進行前置/後置過濾
- Interceptor與Filter用途相似,但實現方式不同
- Interceptor底層就是基於Spring AOP面向切面編程實現
2.2攔截器開發流程
- 添加maven依賴
-
<!--添加攔截器--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <!-- 只是在編碼過程使用,發佈之後不將這個包發不出去--> <scope>provided</scope> </dependency>
-
- 添加一個class實現HandlerInterceptor接口
-
package com.item.springmvc.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @author 14391 */ public class MyInterceptor implements HandlerInterceptor { //生成這個三個方法快捷鍵=>idea code =》lmplement Metod.. //(1)preHandle -前置執行處理 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println(request.getRequestURL() + "-準備執行"); return true; } //(2)postHandle -目標資源已被Spring MVC框架處理,(return之後,但是還沒產生響應文本之前) public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println(request.getRequestURL() + "-目標處理成功"); } //(3)afterCompletion -響應文本已經產生 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println(request.getRequestURL() + "-響應內容已產生"); } }
-
- applicationContext.xml配置過濾地址(如果需要添加一個新的攔截器)
-
<!-- 添加 interceptors 攔截--> <mvc:interceptors> <mvc:interceptor> <!-- 攔截路徑 =》攔截所有--> <mvc:mapping path="/restful/**"/> <mvc:mapping path="/webapi/**"/> <!-- 攔截器過濾請求 也可以只寫一句 例如 /resources/** ,因爲所有的靜態文件都放置在這個文件夾下 --> <mvc:exclude-mapping path="/**.ico"/> <mvc:exclude-mapping path="/**.jpg"/> <mvc:exclude-mapping path="/**.gif"/> <mvc:exclude-mapping path="/**.js"/> <mvc:exclude-mapping path="/**.css"/> <mvc:exclude-mapping path="/resources/**"/> <bean class="com.item.springmvc.interceptor.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors>
-
- 控制器種添加一個方法,測試
-
@GetMapping("/persons") public List<Person> findPersons(){ List list = new ArrayList(); Person p1 = new Person(); p1.setName("lily"); p1.setAge(23); p1.setBirthday(new Date()); Person p2 = new Person(); p2.setName("smith"); p2.setAge(22); p2.setBirthday(new Date()); list.add(p1); list.add(p2); //作爲攔截輸出的參照 System.out.println("RestfulController.findPersons() - return list"); return list; }
-
- 結果輸出
- 拓展:多攔截器輸出