angular.js - 跨域造成session遺失
世界只因有你
世界只因有你 2017-05-15 16:52:59
0
4
754

我部署了一個angular工程 基於nodejs HTTP-server啟動的,登陸url:http://localhost:9000/#/login
java工程專案 登陸url: http://localhost:8060/login
而我現在想在angular工程上完全只是調用java工程項目接口,而java項目現在準備純碎只是為angular工程提供返回的json數據而已
過程中出現跨域問題,我就在java工程上統一設定攔截器 在有新請求呼叫時都設定回應頭:
response.setHeader("Access-Control-Allow-Origin" , "*" ); 即可解決跨域問題;
但session遺失問題沒解決
是說我在angular專案呼叫登陸介面登陸,伺服器端會建立一個session,並傳回使用者資訊及權限資訊等json資料 ,還有回傳一個jsessionid到客戶端;
如圖:

登陸成功跳轉至http://localhost:9000/#/home

但是我在首頁點擊左側選單執行java工程的其他接口時,比如說查詢用戶列表接口,它又被攔截掉,返回login接口,因為由請求頭中找不到對應的jsessionid,相當於當前用戶還處於未登陸狀態
原理是:每次呼叫介面即發出新請求首先都會判斷url上是否攜帶jsession,如果沒有,則判斷請求頭的cookies中有jsession,如果已存在,則會傳到後台,後台透過jsession取得對應session;可是如果jsession不存在或透過jsession取得不到對應session的話,則會從新建立一個session


我想問一下就是怎麼才能避免跨域呼叫介面導致session遺失呢?

世界只因有你
世界只因有你

全部回覆(4)
迷茫

所以到現在都沒有解決方案麼。 。

update
我解決了。後端是Java springboot,前端是angular,跨域json通訊。
cors方式,配置一個corsfilter,程式碼如下:

package xxxxxx.component;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

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

/**
 * Created by skyADMIN on 16/7/4.
 */
@Component
public class CORSFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
        response.setHeader("Access-Control-Allow-Credentials","true"); //是否支持cookie跨域
        chain.doFilter(req, res);
    }

    public void init(FilterConfig filterConfig) {}

    public void destroy() {}

}

這個配置在不少地方應該可以找到,不同的主要是兩點:
1。 response.setHeader("Access-Control-Allow-Credentials","true"); //是否支援cookie跨域
2。 response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));

首先,配置了allow-credentials之後,如果allow-origin設為*,跨域時會報錯說因為允許credentials,origin不能設為通配*,那所以設為簡單的某個domain也是可以的,這種寫法應該就是達到了任意domain都可以的效果吧。

然後angular部分也要設定個東西,舉個栗子~

angular.module('frontendApp')
  .controller('MainCtrl', function ($scope, $http, $location) {
    var action = 'islogin';
    $http.get(apiUrl + action, {withCredentials: true}).then(function (response) {
      console.log(response);
      if (response.data === 0) {
        $location.url('login');
      }
    })
  });

恩就是這個$http.get(url, {withCredentials: true})。
ok就醬。

小葫芦

Access-Control-Allow-Origin設定為*只是用來解決post請求跨域的問題的,cookie是沒法跨域的,或者說只能跨2級域名,每個cookie都會有對應的域,寫的時候可以指定為允許同一個1級域名下的所有2級域名訪問,例如sf的

左手右手慢动作

既然是ng工程,你的載入頁面應該只有一個,讓java這邊幫你做一個入口,回到這個頁面就好了。

引出的問題可能是你的angular模板如果都需要非同步載入,也會跨域,一個方案是像你上面那樣加上origin,另一個是直接將模板也打包成腳本直接加入進去

黄舟

有解決方案了嗎?

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!