中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

SpringBoot配置攔截器及實現(xiàn)跨域訪問的方法

攔截器功能強大,能夠深入方法前后,常應用于日志記錄、權限檢查和性能檢測等,幾乎是項目中不可或缺的一部分,本文就來實現(xiàn)Spring Boot自定義攔截器的配置。

創(chuàng)新互聯(lián)不只是一家網(wǎng)站建設的網(wǎng)絡公司;我們對營銷、技術、服務都有自己獨特見解,公司采取“創(chuàng)意+綜合+營銷”一體化的方式為您提供更專業(yè)的服務!我們經(jīng)歷的每一步也許不一定是最完美的,但每一步都有值得深思的意義。我們珍視每一份信任,關注我們的成都網(wǎng)站制作、網(wǎng)站設計質(zhì)量和服務品質(zhì),在得到用戶滿意的同時,也能得到同行業(yè)的專業(yè)認可,能夠為行業(yè)創(chuàng)新發(fā)展助力。未來將繼續(xù)專注于技術創(chuàng)新,服務升級,滿足企業(yè)一站式成都全網(wǎng)營銷推廣需求,讓再小的成都品牌網(wǎng)站建設也能產(chǎn)生價值!

理論指導

問:Spring Boot怎么配置攔截器?

答:配置一個攔截器需要兩步完成。

  1. 自定義攔截器,實現(xiàn)HandlerInterceptor這個接口。這個接口包括三個方法,preHandle是請求執(zhí)行前執(zhí)行的,postHandler是請求結束執(zhí)行的,但只有preHandle方法返回true的時候才會執(zhí)行,afterCompletion是視圖渲染完成后才執(zhí)行,同樣需要preHandle返回true,該方法通常用于清理資源等工作。
  2. 注冊攔截器。 作用是確定攔截器和攔截的URL。需要繼承WebMvcConfigurationSupport并重寫addInterceptor方法,WebMvcConfigureAdapter已經(jīng)過時了??!

代碼實現(xiàn)

目錄結構:

Spring Boot配置攔截器及實現(xiàn)跨域訪問的方法

具體代碼:

MyInterceptor.java

public class MyInterceptor implements HandlerInterceptor {

  /**
   * preHandle在執(zhí)行Controller之前執(zhí)行,返回true,則繼續(xù)執(zhí)行Contorller
   * 返回false則請求中斷。
   */
  @Override
  public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o)
      throws Exception {
    //只有返回true才會繼續(xù)向下執(zhí)行,返回false取消當前請求 
    long startTime = System.currentTimeMillis();
    httpServletRequest.setAttribute("startTime", startTime);
    return true;
  }

  /**
   * postHandle是在請求執(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是在整個請求執(zhí)行完畢后執(zhí)行
   */
  @Override
  public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
      Object o, Exception e) throws Exception {
  }

}

RegisterInterceptor.java

/**
 * 繼承WebMvcConfigurationSupport繼承并重寫addInterceptor方法用于注冊攔截器
 * WebMvcConfigureAdapter已經(jīng)過時了??!
 */
@Configuration
public class RegisterInterceptor extends WebMvcConfigurationSupport {
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    super.addInterceptors(registry);
  }
}

攔截效果

Spring Boot配置攔截器及實現(xiàn)跨域訪問的方法

更新

跨域訪問

由于JavaScript同源策略,凡是發(fā)送請求url的協(xié)議、域名、端口三者之間任意一與當前頁面地址不同即為跨域。具體的看下表

URL
說明
是否允許通信
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
域名和域名對應ip
不允許
http://www.a.com/a.js
http://script.a.com/b.js
主域相同,子域不同
不允許
http://www.a.com/a.js
http://a.com/b.js
同一域名,不同二級域名(同上)
不允許(cookie這種情況下也不允許訪問)
http://www.cnblogs.com/a.js
http://www.a.com/b.js
不同域名
不允許

上面代碼是可以實現(xiàn)攔截器基本功能,但是這樣是不可以跨域訪問的,前端請求接口會有報錯:XMLHttpRequest cannot loadhttp://xxx/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

解決方案是設置請求頭Access-Control-Allow-Origin為“*”或者設置為和request相同的Origin。

①在攔截器中添加一個設置請求頭的方法。

  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)用這個方法。

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
      throws Exception {
    crossDomain(request, response);
    long startTime = System.currentTimeMillis();
    request.setAttribute("startTime", startTime);
    return true;
  }

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

名稱欄目:SpringBoot配置攔截器及實現(xiàn)跨域訪問的方法
文章位置:http://www.rwnh.cn/article36/gcgpsg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供面包屑導航服務器托管、網(wǎng)站內(nèi)鏈、網(wǎng)站設計公司自適應網(wǎng)站、網(wǎng)站設計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
安吉县| 大关县| 隆德县| 巫山县| 罗平县| 浙江省| 东山县| 曲靖市| 莱州市| 新营市| 浦城县| 澄迈县| 绍兴县| 沾益县| 东乡| 潮州市| 白河县| 新津县| 色达县| 沙雅县| 光山县| 固安县| 庄河市| 兴文县| 黄石市| 博白县| 东阿县| 弥勒县| 丽江市| 马龙县| 东莞市| 唐山市| 古交市| 武平县| 盐山县| 大安市| 新巴尔虎左旗| 焦作市| 望城县| 通海县| 德江县|