當前位置:首頁 » 編程語言 » java跨域

java跨域

發布時間: 2022-12-24 20:08:14

『壹』 怎麼用java實現跨域cookie

通常情況下的話,可以用url的參數來實現。這需要兩個站點有一套固定的規則。比如用戶訪問A站點之後,A站點向url添加一個參數。參數包括了cookie的內容或代表的id,然後重定向到B站點。B站點才能根據A站點傳送的參數解析cookie並進行設置。

『貳』 java session 跨域丟失

首先,跨域操作是所有安全范疇內都被嚴格禁止的。

Session共享,包含同根域與不同根域的兩個情況,如

1. abc.ccc.com和www.ccc.com
2. abc.ccc.com和www.ddd.com

第一種情況,處理辦法相對簡單,第二種就要復雜一些。

如果你想實現Session共享,可以學習一下有關SSO的相關知識。SSO不是一段代碼,而是一個應用系統,它是基於企業級的應用,所以要學習SSO,需要下一番深功夫。

推薦你學習一下Yale大學發起的一個開源項目CAS。

『叄』 如何解決跨域問題

由 於此前很少寫前端的代碼(哈哈,不合格的程序員啊),最近項目中用到json作為系統間交互的手段,自然就伴隨著眾多ajax請求,隨之而來的就是要解決 ajax的跨域問題。本篇將講述一個小白從遇到跨域不知道是跨域問題,到知道是跨域問題不知道如何解決,再到解決跨域問題,最後找到兩種方法解決ajax 跨域問題的全過程。

不知是跨域問題

起 因是這樣的,為了復用,減少重復開發,單獨開發了一個用戶許可權管理系統,共其他系統獲取認證與授權信息,暫且稱之為A系統;調用A系統以B為例。在B系統 中用ajax調用A系統系統的介面(數據格式為json),當時特別困惑,在A系統中訪問相應的url可正常回返json數據,但是在B系統中使用 ajax請求同樣的url則一點兒反應都沒有,好像什麼都沒有發生一樣。這樣反反復復改來改去好久都沒能解決,於是求救同事,提醒可能是ajax跨域問 題,於是就將這個問題當做跨域問題來解決了。

知跨域而不知如何解決

知道問題的確切原因,剩下的就是找到解決問題的方法了。google了好久,再次在同事的指點下知道jQuery的ajax有jsonp這樣的屬性可以用來解決跨域的問題。

找到一種解決方式

現在也知道了怎樣來解決跨域問題,餘下的就是實現的細節了。實現的過程中錯誤還是避免不了的。由於不了解json和jsonp兩種格式的區別,也犯了錯誤,google了好久才解決。

首先來看看在頁面中如何使用jQuery的ajax解決跨域問題的簡單版:

復制代碼
$(document).ready(function(){
var url='http://localhost:8080/WorkGroupManagment/open/getGroupById"
+"?id=1&callback=?';
$.ajax({
url:url,
dataType:'jsonp',
processData: false,
type:'get',
success:function(data){
alert(data.name);
},
error:function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
}});
});
復制代碼
這樣寫是完全沒有問題的,起先error的處理函數中僅僅是alert(「error」),為了進一步弄清楚是什麼原因造成了錯誤,故將處理函數變 為上面的實現方式。最後一行alert使用為;parsererror。百思不得其解,繼續google,最終還是在萬能的stackoverflow找 到了答案,鏈接在這里。原因是jsonp的格式與json格式有著細微的差別,所以在server端的代碼上稍稍有所不同。

比較一下json與jsonp格式的區別:

json格式:
{
"message":"獲取成功",
"state":"1",
"result":{"name":"工作組1","id":1,"description":"11"}
}
jsonp格式:
callback({
"message":"獲取成功",
"state":"1",
"result":{"name":"工作組1","id":1,"description":"11"}
})
看出來區別了吧,在url中callback傳到後台的參數是神馬callback就是神馬,jsonp比json外面有多了一層,callback()。這樣就知道怎麼處理它了。於是修改後台代碼。

後台java代碼最終如下:

復制代碼
@RequestMapping(value = "/getGroupById")
public String getGroupById(@RequestParam("id") Long id,
HttpServletRequest request, HttpServletResponse response)
throws IOException {
String callback = request.getParameter("callback");
ReturnObject result = null;
Group group = null;
try {
group = groupService.getGroupById(id);
result = new ReturnObject(group, "獲取成功", Constants.RESULT_SUCCESS);
} catch (BusinessException e) {
e.printStackTrace();
result = new ReturnObject(group, "獲取失敗", Constants.RESULT_FAILED);
}
String json = JsonConverter.bean2Json(result);
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.print(callback + "(" + json + ")");
return null;
}
復制代碼
注意這里需要先將查詢結果轉換我json格式,然後用參數callback在json外面再套一層,就變成了jsonp。指定數據類型為jsonp的ajax就可以做進一步處理了。

雖然這樣解決了跨域問題,還是回顧下造成parsererror的原因。原因在於盲目的把json格式的數據當做jsonp格式的數據讓ajax處理,造成了這個錯誤,此時server端代碼是這樣的:

復制代碼
@RequestMapping(value = "/getGroupById")
@ResponseBody
public ReturnObject getGroupById(@RequestParam("id") Long id,
HttpServletRequest request, HttpServletResponse response){
String callback = request.getParameter("callback");
ReturnObject result = null;
Group group = null;
try {
group = groupService.getGroupById(id);
result = new ReturnObject(group, "獲取成功", Constants.RESULT_SUCCESS);
} catch (BusinessException e) {
e.printStackTrace();
result = new ReturnObject(group, "獲取失敗", Constants.RESULT_FAILED);
}
return result;
}
復制代碼
至此解決ajax跨域問題的第一種方式就告一段落。

追加一種解決方式

追求永無止境,在google的過程中,無意中發現了一個專門用來解決跨域問題的jQuery插件-jquery-jsonp。

有第一種方式的基礎,使用jsonp插件也就比較簡單了,server端代碼無需任何改動。

來看一下如何使用jquery-jsonp插件解決跨域問題吧。

復制代碼
var url="http://localhost:8080/WorkGroupManagment/open/getGroupById"
+"?id=1&callback=?";
$.jsonp({
"url": url,
"success": function(data) {
$("#current-group").text("當前工作組:"+data.result.name);
},
"error": function(d,msg) {
alert("Could not find user "+msg);
}
});

『肆』 如何在java應用中跨域共享session,比如希

首先一點,你要明白session的大部分實現都是通過cookie的,所以跨域session是不可能的。
但跨域的認證還是可以有OAuth等實現方法,但不太推薦OAuth項目貌似爛尾了,隨然大家都在用。

其次雖然跨域有點難,但放在同一域下的不同項目是可以共享session的,CAS也不算復雜,你可以上github搜一下redis-session這個項目,只有一個源代碼文件,它給出了redis下session的一種nodejs實現,就是設置redis的超時來模擬session的超時。

再次,跨域也是可以的,就是使用iframe,在登錄時,在多個域下同時寫cookie,注意瀏覽器差異。

綜上,你的想法完全可行。

『伍』 java為什麼會有跨域問題

前言

相信大家在寫前端腳本的時候經常會遇到發送數據到後台的情況,但是由於瀏覽器的限制,不同域名之間的數據是不能互相訪問的,那前端怎麼和後端如何進行數據之間的交換呢?

JavaScript由於安全性方面的考慮,不允許頁面跨域調用其他頁面的對象,那麼問題來了,什麼是跨域問題?

答:這是由於瀏覽器同源策略的限制,現在所有支持JavaScript的瀏覽器都使用了這個策略。那麼什麼是同源呢?所謂的同源是指三個方面「相同」:

  • 域名相同

  • 協議相同

  • 埠相同

  • 下面就舉幾個例子來幫助更好的理解同源策略。

    URL

    說明

    是否允許通信

    http://www.a.com/a.js
    http://www.a.com/b.js 同一域名 允許

    http://www.a.com/a.js
    http://www.b.com/a.js 不同域名 不允許

    http://www.a.com:8000/a.js
    http://www.a.com/b.js 同一域名不同埠 不允許

    https://www.a.com/a.js
    http://www.a.com/b.js 同一域名不同協議 不允許

    在JAVA中處理跨域問題,通常有以下兩種常用的解決方法。

    第一種解決方法

    後台代碼在被請求的Servlet中添加Header設置:

  • response.setHeader("Access-Control-Allow-Origin", "*");

  • PrintWriter out =null;

  • try

  • {

  • out = response.getWriter();

  • } catch (IOException e)

  • {

  • // TODO Auto-generated catch block

  • e.printStackTrace();

  • }

  • out.print("{'status':'ok'}");

  • out.flush();

  • out.close();

  • Access-Control-Allow-Origin這個Header在W3C標准里用來檢查該跨域請求是否可以被通過,如果值為*則表明當前頁面可以跨域訪問。默認的情況下是不允許的。

    在前端JS中需要向Servlet發出請求,請求代碼如下所示:

  • $.ajax({

  • url: "your url",

  • type:"get or post",

  • dataType:"json",

  • data:{

  • ....

  • },

  • success:function(data){

  • ...

  • }

  • 第二種解決方法

    通過jsonp跨域請求的方式。JSONP和JSON雖然只有一個字母的區別,但是他們完全就是兩回事,很多人很容易把他們搞混。JSON是一種數據交換的格式,而JSONP則是一種非官方跨域數據交互協議。

    首先來說一下前端JS是怎麼發送請求。代碼如下所示:

  • $.ajax({

  • url:"your url",

  • type:"get or post",

  • async:false,

  • dataType : "jsonp",

  • //服務端用於接收callback調用的function名的參數

  • jsonp:"callbackparam",

  • //callback的function名稱

  • jsonpCallback:"success_jsonpCallback",

  • success:function(data){

  • console.log(data);

  • },

  • error:function(data){

  • console.log(data);

  • }

  • });

  • 這里的callbackparam和success_jsonpCallback可以理解為發送的data數據的鍵值對,可以自定義,但是callbackparam需要和後台約定好參數名稱,因為後台需要獲取到這個參數裡面的值(即success_jsonpCallback)。

    下面,最重要的來了,後台怎麼樣獲取和返回數據呢。代碼如下所示:

  • PrintWriter out =null;

  • String callback=req.getParameter("callbackparam");

  • String json=callback+"({'status':'ok'})";

  • try

  • {

  • out = resp.getWriter();

  • } catch (IOException e)

  • {

  • // TODO Auto-generated catch block

  • e.printStackTrace();

  • }

  • out.print(json);

  • out.flush();

  • out.close();

  • 首先需要獲取參數名為callbackparam的值,這里獲取到的值就是「success_jsonpCallback」。然後將這個值加上一對小括弧。小括弧里放入你需要返回的數據內容,比如這里我返回一個JSON對象。當然你也可以返回其他對象,比如只返回一個字元串類型數據也可以。最後前端JS返回的數據就是這樣的:

  • success_jsonpCallback({'status':'ok'})

  • 瀏覽器會自動解析為json對象,這時候你只需要在success回調函數中直接用data.status就可以了。

『陸』 java中list.fetch什麼意思

跨域請求。java是一門面向對象編程語言。java中listfetch是跨域請求的意思。1990年代初由詹姆斯高斯林等人開發出Java語言的雛形,最初被命名為Oak。

『柒』 後端解決前端跨域請求問題

場景:前後端分離,頁面和後端項目部署在不同伺服器,出現請求跨域問題。

原因:CORS:跨來源資源共享(CORS)是一份瀏覽器技術的規范,提供了 Web 服務從不同網域傳來沙盒腳本的方法,以避開瀏覽器的同源策略,是 JSONP 模式的現代版。與 JSONP 不同,CORS 除了 GET 要求方法以外也支持其他的 HTTP 要求。用 CORS 可以讓網頁設計師用一般的 XMLHttpRequest,這種方式的錯誤處理比JSONP要來的好,JSONP對於 RESTful 的 API 來說,發送 POST/PUT/DELET 請求將成為問題,不利於介面的統一。但另一方面,JSONP 可以在不支持 CORS 的老舊瀏覽器上運作。不過現代的瀏覽器(IE10以上)基本都支持 CORS。

預檢請求(option):在 CORS 中,可以使用 OPTIONS 方法發起一個預檢請求(一般都是瀏覽檢測到請求跨域時,會自動發起),以檢測實際請求是否可以被伺服器所接受。預檢請求報文中的 Access-Control-Request-Method 首部欄位告知伺服器實際請求所使用的 HTTP 方法;Access-Control-Request-Headers 首部欄位告知伺服器實際請求所攜帶的自定義首部欄位。伺服器基於從預檢請求獲得的信息來判斷,是否接受接下來的實際請求。

解決方案:

1、創建一個過濾器,過濾options請求。

package com.biz.eisp.sci.util;

import org.apache.commons.httpclient.HttpStatus;

import javax.servlet.*;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

/**

* 解決跨域問題



*/

public class CorsFilterimplements Filter {//filter 介面的自定義實現

    public void init(FilterConfig filterConfig)throws ServletException {

}

@Override

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws IOException, ServletException {

HttpServletResponse response = (HttpServletResponse) servletResponse;

        HttpServletRequest request = (HttpServletRequest) servletRequest;

        response.setHeader("Access-Control-Allow-Origin", "*");

        if ("OPTIONS".equals(request.getMethod())){//這里通過判斷請求的方法,判斷此次是否是預檢請求,如果是,立即返回一個204狀態嗎,標示,允許跨域;預檢後,正式請求,這個方法參數就是我們設置的post了

            response.setStatus(HttpStatus.SC_NO_CONTENT); //HttpStatus.SC_NO_CONTENT = 204

            response.setHeader("Access-Control-Allow-Methods", "POST, GET, DELETE, OPTIONS, DELETE");//當判定為預檢請求後,設定允許請求的方法

            response.setHeader("Access-Control-Allow-Headers", "Content-Type, x-requested-with"); //當判定為預檢請求後,設定允許請求的頭部類型

            response.addHeader("Access-Control-Max-Age", "1");  // 預檢有效保持時間

        }

filterChain.doFilter(request, response);

    }

@Override

    public void destroy() {

}

}

2、修改web.xml文件

<filter>

 <filter-name>cors</filter-name>

  <filter-class>com.biz.eisp.sci.util.CorsFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>cors</filter-name>

  <url-pattern>/* </url-pattern>

</filter-mapping>

3、spring-mvc.xml添加HttpRequestHandlerAdapter http請求處理器適配器。

HttpRequestHandlerAdapter作為HTTP請求處理器適配器僅僅支持對HTTP請求處理器的適配。它簡單的將HTTP請求對象和響應對象傳遞給HTTP請求處理器的實現,它並不需要返回值。它主要應用在基於HTTP的遠程調用的實現上。

<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>

『捌』 JAVA跨域問題

跨域問題一般都在後台程序解決,將自己的程序通過配置文件或者代碼將其允許跨域,
在有跨域安全的時候,所有前端post請求時,會發送一個與其請求名字一樣的OPTIONS

此請求沒有任何參數,此機制為post不知道是否有許可權請求介面,發送了一個探知請求,探知
請求確認後,允許訪問後調用正常Post介面。 不允許就會出現你現在的問題跨域異常。
萌新,java是開源的,比NET好多了,多看看底層

『玖』 java伺服器端怎麼設置ajax 的跨域請求頭

在服務端設置response.setHeader("Access-Control-Allow-Origin", "*");即可。
Access-Control-Allow-Origin:* 表示允許任何域名跨域訪問
如果需要指定某域名才允許跨域訪問,只需把Access-Control-Allow-Origin:*改為Access-Control-Allow-Origin:允許的域名

例如:response.setHeader("Access-Control-Allow-Origin", "http://www.client.com");

『拾』 我的一個java請求,該如何設置別人就可以跨域訪問我的請求得到數據

一、通過jsonp跨域

在js中,我們直接用XMLHttpRequest請求不同域上的數據時,是不可以的。但是,在頁面上引入不同域上的js腳本文件卻是可以的,jsonp正是利用這個特性來實現的。

比如,有個a.html頁面,它裡面的代碼需要利用ajax獲取一個不同域上的json數據,假設這個json數據地址是http://example.com/data.php,那麼a.html中的代碼就可以這樣:

我們看到b頁面成功的收到了消息。

使用postMessage來跨域傳送數據還是比較直觀和方便的,但是缺點是IE6、IE7不支持,所以用不用還得根據實際需要來決定。

結語:

除了以上幾種方法外,還有flash、在伺服器上設置代理頁面等跨域方式,這里就不做介紹了。

以上四種方法,可以根據項目的實際情況來進行選擇應用,個人認為window.name的方法既不復雜,也能兼容到幾乎所有瀏覽器,這真是極好的一種跨域方法。

熱點內容
python數據分析實戰pdf 發布:2025-05-17 14:49:42 瀏覽:950
海瀾之家廣告腳本 發布:2025-05-17 13:56:06 瀏覽:30
手文件夾恢復 發布:2025-05-17 13:53:32 瀏覽:993
linux怎麼看進程 發布:2025-05-17 13:53:30 瀏覽:303
thinkphp欄位緩存 發布:2025-05-17 13:52:01 瀏覽:575
山靈app安卓版如何設置 發布:2025-05-17 13:51:49 瀏覽:388
帆布壓縮袋 發布:2025-05-17 13:26:27 瀏覽:457
c語言16進製表示方法 發布:2025-05-17 13:11:25 瀏覽:480
ftp單位 發布:2025-05-17 13:10:03 瀏覽:142
c語言編寫n的階乘 發布:2025-05-17 13:10:02 瀏覽:685