1. 程式人生 > >javaWeb後臺配置跨域的方法

javaWeb後臺配置跨域的方法

#說明
  本文給出幾種java後端配置跨域的方法,在tomcat7和8上測試通過。如果你只是為了前後端聯調的話,那最好不要採用配置後端的方法,而是使用前端框架提供的解決方案,比如你使用的是vue框架的話,可以採用參考這篇博文:https://www.jianshu.com/p/95b2caf7e0da

#方法一
  如果只需要Http的Get與Post方法跨域的話,則使用下面的方法可以很輕鬆的解決:
  在web.xml中新增如下過濾器,這個過濾器是tomcat自帶的,所以不需要新增任何額外的依賴:

<!--為了允許跨域訪問-->
<filter>
    <filter-name
>
CorsFilter</filter-name> <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> </filter> <filter-mapping> <filter-name>CorsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

#方法二
  方法一經過我的測試僅僅能夠讓post和put請求跨域,其他請求如put,delete請求仍然無法跨域,有的部落格上說能夠通過在上面的過濾器配置中新增如下的初始化引數來解決:

<!--該配置依舊無法讓delete和put等請求跨域-->
<filter>
        <filter-name>CorsFilter</filter-name>
        <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
        <init-param>
            <param-name>cors.allowOrigin</param-name>
            <
param-value
>
*</param-value> </init-param> <init-param> <param-name>cors.supportedMethods</param-name> <param-value>GET, POST, HEAD, PUT, DELETE</param-value> </init-param> <init-param> <param-name>cors.supportedHeaders</param-name> <param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified</param-value> </init-param> </filter>

從引數名看,上面的引數似乎非常有可能解決問題,但是我嘗試了之後,delete和put等請求依舊無法跨域,但是我伺服器給客戶端的api想要儘量滿足RESTful的風格,那麼put和delete的方法請求伺服器肯定是必不可少的,於是我只能嘗試著自己寫過濾器了,我調研了一下伺服器禁止跨域的原理,通過抓包發現瀏覽器在進行跨域訪問之前會先用options方法請求tomcat伺服器,然後tomcat伺服器會用http響應頭返回一些引數,比如"Access-Control-Allow-Methods"引數表示允許跨域的Http方法,"Access-Control-Allow-Origin"引數表示允許跨域的源,"Access-Control-Allow-Headers"表示跨域允許的請求頭的引數.

引數名 含義
Access-Control-Allow-Methods 允許跨域的Http方法
Access-Control-Allow-Origin 允許跨域的源地址
Access-Control-Allow-Headers 跨域允許的請求頭的引數

根據伺服器返回的引數,如果瀏覽器發現該跨域請求非法,則會禁止該跨域請求。有了這些知識之後,其實只要自己在java端寫一個全域性過濾器就可以了,給所有請求的響應都加上那幾個引數,表示允許對伺服器進行任何跨域訪問,這樣瀏覽器就不會加以阻止了,過濾器的程式碼如下:

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CORSFilter implements Filter {

    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
        //*表示允許所有域名跨域
        httpResponse.addHeader("Access-Control-Allow-Origin", "*");
        httpResponse.addHeader("Access-Control-Allow-Headers",
                "Origin, X-Requested-With, Content-Type, Accept");
        //允許跨域的Http方法
        httpResponse.addHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    public void destroy() {

    }
}

可以看出這一段程式碼只是在響應頭上面加了三個引數而已,之後在web.xml上面配置:

    <!--為了允許跨域訪問-->
    <filter>
        <filter-name>CorsFilter</filter-name>
        <filter-class>org.du.personalsitemock.mockutil.CORSFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>CorsFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

經過測試,這個方法可以保證DELETE和PUT等方法也可以跨域,到此跨域問題就解決了。而且你會發現還可以通過Access-*那三個引數的值進行更加靈活的配置,比如只允許部分源地址可以跨域等等。

相關推薦

javaWeb後臺配置方法

#說明   本文給出幾種java後端配置跨域的方法,在tomcat7和8上測試通過。如果你只是為了前後端聯調的話,那最好不要採用配置後端的方法,而是使用前端框架提供的解決方案,比如你使用的是vue框架的話,可以採用參考這篇博文:https://www.jians

htaccess下配置方法

允許所有域名跨域 <IfModule mod_headers.c> Header add Access-Control-Allow-Origin: * </IfModule> 指定域名跨域 <IfModule mod_

Nginx配置-http請求方法OPTIONS

Nginx配置跨域 http請求方法OPTIONS 看到標題有點扯,為什麼跨域與http的請求方法options有關係,因為當你跨域獲取資源時,瀏覽會出於安全的考慮會先使用OPTIONS做請求,

js中幾種實用的方法原理詳解

自身 標簽 cdc 返回 屬性和方法 插入 實用 封裝 判斷 這裏說的js跨域是指通過js在不同的域之間進行數據傳輸或通信,比如用ajax向一個不同的域請求數據,或者通過js獲取頁面中不同域的框架中(iframe)的數據。只要協議、域名、端口有任何一個不同, 都被當作是不同

vue 配置訪問

class 服務器 gif .cn str ble scrip eap blank 主要在config->index.js中配置 proxyTable: { ‘/gameapi’: { changeOrigin: true, // target

Nginx配置請求 Access-Control-Allow-Origin *

默認 all 之前 methods 不包含 通知 text options flight 當出現403跨域錯誤的時候 No ‘Access-Control-Allow-Origin‘ header is present on the requested resource,需

AJAX介紹及方法

很大的 需要 求和 請求 完全 準備 city 機器 query Ajax準備知識:json 什麽是json? 定義: JSON(JavaScript Object Notation, JS 對象標記) 是一種輕量級的數據交換格式。 它基於 ECMAScript (w3c

nginx裏配置

接口 accept PC 反向代理 ply frs alt 收藏 sport 發布於 881天前 作者 wendal 1404 次瀏覽 復制 上一個帖子 下一個帖子 標簽: nginx 跨域 if ($request_me

ASP.NET Core 配置(CORS)

tin sha har exce pub header service 策略 uil 1.安裝程序CORS程序包 Install-Package Microsoft.AspNetCore.Mvc.Cors 一般默認都帶了此程序包的 2.配置CORS服務 在 Startu

限制原因及常見方法

允許 arr 跨域訪問 function 自己 ava content 由於 target 跨域 遊覽器的同源策略(瀏覽器對JavaScript施加的安全限制)(也就是說服務端不受限制) 同源策略: 1.DOM同源策略:禁止對不同源頁面DOM進行操作。這裏主要場景是ifra

Nginx配置訪問

由於瀏覽器同源策略的存在使得一個源中載入來自其它源中資源的行為受到了限制。即會出現跨域請求禁止。 通俗一點說就是如果存在協議、域名、埠或者子域名不同服務端,或一者為IP地址,一者為域名地址(在跨域問題上,域僅僅是通過"url的首部"來識別而不會去嘗試判斷相同的IP地址對應著兩個域或者兩個

vue-cli(vue2.x)配置請求代理,設定請求頭

1、在config/index.js設定配置檔案,跨域配置代理 (預設裡面內容為空,我們需要加入對跨域介面的配置) 根據介面的不同設定的請求頭和主機也不同,自己按照格式要求進行配置即可。 如上圖配置好了之後,'/apis/getSongLyric'為自定義的axios請求路徑,自己根據相

後臺解決問題

//允許所有地址 response.setHeader("Access-Control-Allow-Origin", "*"); //允許的方法 response.setHeader("Access-Control-Allow-Methods", "POST, GET,PUT, OPT

WebApi使用cors配置問題

1.首先安裝CORS,在WebApiCors專案上面使用Nuget搜尋“microsoft.aspnet.webapi.cors”,安裝第一個  2.當我們安裝這個包之後,現有的packages目錄下會新增兩個名稱分別為“Microsoft.AspNet.Cors.5.2.3”和“Microsof

System.Web.Http.Cors配置訪問的兩種方式

在webapi中使用System.Web.Http.Cors配置跨域資訊可以有兩種方式。   一種是在App_Start.WebApiConfig.cs的Register中配置如下程式碼,這種方式將在所有的webapi Controller裡面起作用。 using System; usi

HTML5前端初級入門教程:AJAX及常用的兩種方法

​ 首先什麼是AJAX?          AJAX : Asynchronous JavaScript and XML(非同步JavaScript和XML技術)。   

Vue webpack配置的基本配置和問題的注意

1,首先進行一個ProxyTable的一個配置,如下圖《正確的配置》   2、將這個配置的檔案匯入進config/index.js let proxyConfig = require('./proxyConfig') proxyTable: proxyConfig.p

vue 檔案 http配置 問題 俱全

/** * http配置 */ import axios from 'axios' import qs from 'qs' import store from '../store/index' import router from '../router/index' import {getSto

JS 中幾種實用的方法原理詳解

這裡說的js跨域是指通過js在不同的域之間進行資料傳輸或通訊,比如用ajax向一個不同的域請求資料,或者通過js獲取頁面中不同域的框架中(iframe)的資料。只要協議、域名、埠有任何一個不同,都被當作是不同的域。 下表給出了相對http://store.company.com/dir/page

常見方法原理及其用例

一、常見跨域方法 1) JSONP跨域 需要目標伺服器配合一個callback函式2) AJAX跨域 CORS3) 使用window.name+iframe來進行跨域 4) window.postMessage:跨文件通訊 API(Cross-document messaging)5) 跨子域:修改docu