溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何在JAVA中利用Filter允許服務(wù)跨域請求

發(fā)布時間:2021-05-14 18:03:02 來源:億速云 閱讀:331 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關(guān)如何在JAVA中利用Filter允許服務(wù)跨域請求,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

Jsonp

 在前后端分離的項(xiàng)目中,會經(jīng)常遇到需要跨域請求的問題。跨域請求有多種方式。之前接觸過jsonp的方式。
 這種方式是在前端頁面進(jìn)行跨域請求兼容性好,但安全性比較差,只支持GET請求。

CORS

 Cross-Origin Resource Sharing 即跨源資源共享 。是一個新的 W3C 標(biāo)準(zhǔn),它新增的一組HTTP首部字段,允許服務(wù)端其聲明哪些源站有權(quán)限訪問哪些資源。

 也就是說它允許瀏覽器向聲明了 CORS 的跨域服務(wù)器,發(fā)出 XMLHttpReuest 請求,從而克服 Ajax 只能同源使用的限制。

Http頭部字段介紹

 Access-Control-Allow-Origin:響應(yīng)首部中可以攜帶這個頭部表示服務(wù)器允許哪些域可以訪問該資源
 Access-Control-Allow-Methods:該首部字段用于預(yù)檢請求的響應(yīng),指明實(shí)際請求所允許使用的HTTP方法
 Access-Control-Allow-Headers:該首部字段用于預(yù)檢請求的響應(yīng)。指明了實(shí)際請求中允許攜帶的首部字段
 Access-Control-Max-Age:該首部字段用于預(yù)檢請求的響應(yīng),指定了預(yù)檢請求能夠被緩存多久
 Access-Control-Allow-Credentials:該字段可選。它的值是一個布爾值,表示是否允許發(fā)送Cookie。默認(rèn)情況下,Cookie不包括在CORS請求之中。設(shè)為true,即表示服務(wù)器明確許可,Cookie可以包含在請求中,一起發(fā)給服務(wù)器

具體實(shí)現(xiàn)

這里通過過濾器的方式對請求進(jìn)行攔截。設(shè)置http的響應(yīng)header來實(shí)現(xiàn)。

public class CrossFilter implements Filter {
  protected Logger logger = LoggerFactory.getLogger(getClass());
  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
  }
  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest request=(HttpServletRequest)servletRequest;
    HttpServletResponse response=(HttpServletResponse)servletResponse;
    logger.info("【允許跨域訪問】refererUrl【{}】", request.getHeader("Referer"));
    //允許跨域訪問
    response.setContentType("text/html;charset=UTF-8");
    response.setHeader("Access-Control-Allow-Origin", "https://monline.01zhuanche.com");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "0");
    response.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,Authorization,SessionToken,JSESSIONID,token");
    response.setHeader("Access-Control-Allow-Credentials", "true");
    response.setHeader("XDomainRequestAllowed","1");
    filterChain.doFilter(request, response);
  }
  public static String getRefererUrl(HttpServletRequest request){
    String returnValue = null;
    if(request != null && !StringUtils.isEmpty(request.getHeader("Referer"))) {
      returnValue = request.getHeader("Referer");
      String[] urls = returnValue.split("/");
      if(urls != null && urls.length > 3) {
        returnValue = urls[0] + "//" + urls[2];
      }
    }
    return returnValue;
  }
  @Override
  public void destroy() {
  }
}

此外需要對我們的過濾器進(jìn)行配置,在web.xml文件中添加如下配置:

<filter>
  <filter-name>crossDomainFilter</filter-name>
  <filter-class>com.open.advertise.api.cooperation.filter.CrossFilter</filter-class>
  <init-param>
   <param-name>targetFilterLifecycle</param-name>
   <param-value>true</param-value>
  </init-param>
 </filter>

 <filter-mapping>
  <filter-name>crossDomainFilter</filter-name>
  <url-pattern>/*</url-pattern> <!--可以針對某個接口進(jìn)行限制-->
 </filter-mapping>

Java的特點(diǎn)有哪些

Java的特點(diǎn)有哪些 1.Java語言作為靜態(tài)面向?qū)ο缶幊陶Z言的代表,實(shí)現(xiàn)了面向?qū)ο罄碚?,允許程序員以優(yōu)雅的思維方式進(jìn)行復(fù)雜的編程。 2.Java具有簡單性、面向?qū)ο?、分布式、安全性、平臺獨(dú)立與可移植性、動態(tài)性等特點(diǎn)。 3.使用Java可以編寫桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序等。

以上就是如何在JAVA中利用Filter允許服務(wù)跨域請求,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI