spring 基礎(四)瀏覽器跨域訪問+攔截器(Interceptor)

1瀏覽器跨域訪問

1.1瀏覽器的同源策略

  1. 同源策略阻止從一個域加載的腳本去獲取另一個域上的資源。
  2. 只要協議、域名、端口有任何一-個不同,都被當作是不同的域。
  3. 瀏覽器Console看到Access-Control-Allow-Origin就代表跨域了。
  4. 示例
  5. HTML種允許跨域標籤
    1. <img> -顯示遠程圖片
    2. <script> -加載遠程JS
    3. <link> -加載遠程CSS

1.2跨域的解決措施

  1. CORS跨域資源訪問
    1. CORS是一 種機制,使用額外的HTTP頭通知瀏覽器可以訪問其他域。
    2. URL響應頭包含Access-Control-*指明請求允許跨域。
  2. SpringMVC解決跨域訪問
    1. @CrossOrigin  Controller跨域註解(只針對一個Controller有效,多個控制器需要多此添加)
    2. /**
       * 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\":\"返回查詢結果\"}";
          }
      }
    3. <mvc:cors> SrpingMvc全局跨域配置(applicationContext.xml中配置)
      1. <!--    添加跨域請求-->
            <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基礎

  1. 攔截器(Interceptor)用於對URL請求進行前置/後置過濾
  2. Interceptor與Filter用途相似,但實現方式不同
  3. Interceptor底層就是基於Spring AOP面向切面編程實現

2.2攔截器開發流程

  1. 添加maven依賴
    1. <!--添加攔截器-->
              <dependency>
                  <groupId>javax.servlet</groupId>
                  <artifactId>javax.servlet-api</artifactId>
                  <version>4.0.1</version>
      <!--            只是在編碼過程使用,發佈之後不將這個包發不出去-->
                  <scope>provided</scope>
              </dependency>
  2. 添加一個class實現HandlerInterceptor接口
    1. 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() + "-響應內容已產生");
          }
      }
  3. applicationContext.xml配置過濾地址(如果需要添加一個新的攔截器)  
    1. <!--    添加 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>
  4. 控制器種添加一個方法,測試
    1.     @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;
          }
  5. 結果輸出
  6. 拓展:多攔截器輸出


    1.  

       

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章