JAVA通過Filter實現允許服務跨域請求的方法

這裏的域指的是這樣的一個概念:我們認爲若協議 + 域名 + 端口號均相同,那麼就是同域即我們常說的瀏覽器請求的同源策略。這篇文章主要介紹了JAVA通過Filter實現允許服務跨域請求,需要的朋友可以參考下

概念

 在 HTML 中,<a>, <form>, <img>, <script>, <iframe>, <link> 等標籤以及 Ajax 都可以指向一個資源地址, 而所謂的跨域請求就是指:當前發起請求的域與該請求指向的資源所在的域不一樣。

 這裏的域指的是這樣的一個概念:我們認爲若協議 + 域名 + 端口號均相同,那麼就是同域即我們常說的瀏覽器請求的同源策略。

Jsonp

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

CORS

 Cross-Origin Resource Sharing 即跨源資源共享 。是一個新的 W3C 標準,它新增的一組HTTP首部字段,允許服務端其聲明哪些源站有權限訪問哪些資源。

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

Http頭部字段介紹

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

具體實現

這裏通過過濾器的方式對請求進行攔截。設置http的響應header來實現。

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() {
  }
}

此外需要對我們的過濾器進行配置,在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> <!--可以針對某個接口進行限制-->
 </filter-mapping>

以上,對於設置的跨域請求的域名就可以進行跨域訪問啦。

以上所述是小編給大家介紹的JAVA通過Filter實現允許服務跨域請求,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對神馬文庫網站的支持!

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