我部署了一个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丢失呢?
迷茫2017-05-15 16:54:59
今のところ解決策はないのでしょうか? 。
アップデート
解決しました。バックエンドは Java springboot、フロントエンドは Angular、クロスドメイン JSON 通信が使用されます。
Cors メソッド、corsfilter を設定します。コードは次のとおりです:
この構成は多くの場所で見られます。主な違いは 2 点です。
1. response.setHeader("Access-Control-Allow-Credentials","true"); // Cookie がドメイン間でサポートされるかどうか
2. response.setHeader("アクセス制御許可オリジン", request.getHeader("オリジン"));
まず第一に、allow-credentials を設定した後、allow-origin が * に設定されている場合、ドメインを越えるときにエラーが報告され、資格情報が許可されているため、origin をワイルドカード * に設定できないというメッセージが表示されます。これを単純なドメインに設定します。この記述方法は、どのドメインでも効果を発揮するはずです。
その後、角度部分にも何かを設定する必要があります。たとえば〜
リーリーこれは $http.get(url, {withCredentials: true}) です。
さて、ソースだけ。
高洛峰2017-05-15 16:54:59
Access-Control-Allow-Origin は、クロスドメイン投稿リクエストの問題を解決するためにのみ設定されます。Cookie はドメインを越えることができない、または 2 レベルのドメイン名のみを越えることができます。各 Cookie は対応するドメインを持ち、書き込みが可能です。同じ第 1 レベルのドメイン名の下にあるすべての第 2 レベルのドメイン名 (sf の
など) へのアクセスを許可するように指定されています。ringa_lee2017-05-15 16:54:59
これは NG プロジェクトなので、読み込みページは 1 つだけにしておいて、Java に入り口を作ってこのページに戻ってもらいます。
問題は、Angular テンプレートを非同期でロードする必要がある場合、ドメインをまたがることになる可能性があります。解決策の 1 つは、上記のようにオリジンを追加することであり、もう 1 つは、テンプレートをスクリプトに直接パッケージ化して直接追加することです。