Maison > Questions et réponses > le corps du texte
我部署了一个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
Il n’y a donc pas encore de solution. .
mise à jour
Je l'ai résolu. Le backend est Java Springboot, le frontend est angulaire et la communication JSON inter-domaines est utilisée.
Mode Cors, configurez un corsfilter, le code est le suivant :
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() {}
}
Cette configuration devrait se retrouver à de nombreux endroits. Les principales différences sont deux points :
1. réponse.setHeader("Access-Control-Allow-Credentials","true"); //Si les cookies sont pris en charge sur tous les domaines
2. réponse.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
Tout d'abord, après avoir configuré les autorisations d'identification, si l'autorisation d'origine est définie sur *, une erreur sera signalée lors du croisement de domaines, indiquant que l'origine ne peut pas être définie sur un caractère générique * car les informations d'identification sont autorisées, donc c'est également possible pour le définir sur un domaine simple, cette méthode d'écriture devrait produire l'effet de n'importe quel domaine.
Ensuite, la partie angulaire doit également définir quelque chose, par exemple~
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');
}
})
});
Eh bien, voici $http.get(url, {withCredentials : true}).
Ok, c'est tout.
高洛峰2017-05-15 16:54:59
Définir Access-Control-Allow-Origin sur * n'est utilisé que pour résoudre le problème des demandes de publication inter-domaines. Les cookies ne peuvent pas traverser les domaines, ou ils ne peuvent traverser que les noms de domaine de deuxième niveau. Chaque cookie aura un domaine correspondant. . , lors de l'écriture, il peut être spécifié pour autoriser l'accès à tous les noms de domaine de deuxième niveau sous le même nom de domaine de premier niveau, comme par exemple
de sf.ringa_lee2017-05-15 16:54:59
Comme il s'agit d'un projet ng, vous ne devriez avoir qu'une seule page de chargement. Laissez simplement Java faire une entrée pour vous et revenez à cette page.
Le problème peut être que si votre modèle angulaire doit être chargé de manière asynchrone, il traversera également le domaine. Une solution consiste à ajouter origin comme vous l'avez fait ci-dessus, et l'autre consiste à empaqueter directement le modèle dans un script et à l'ajouter. directement