我部署了一个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
그럼 현재까지는 해결책이 없나요? .
update
해결했습니다. 백엔드는 Java springboot이고, 프런트엔드는 각도이며, 도메인 간 json 통신이 사용됩니다.
Cors 메서드, corsfilter 구성, 코드는 다음과 같습니다.
이 구성은 여러 곳에서 발견됩니다. 주요 차이점은 두 가지입니다.
1. response.setHeader("Access-Control-Allow-Credentials","true"); //도메인 전반에 걸쳐 쿠키가 지원되는지 여부
2. response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
먼저, 허용 자격 증명을 구성한 후, 허용 원본을 *로 설정하면 도메인 교차 시 자격 증명이 허용되므로 원본을 와일드카드*로 설정할 수 없다는 오류가 보고되므로 다음도 가능합니다. 간단한 도메인으로 설정하세요. 이 쓰기 방법은 모든 도메인의 효과를 달성해야 합니다.
그런 다음 각도 부분에도 뭔가를 설정해야 합니다. 예를 들어~
으아악글쎄요, $http.get(url, {withCredentials: true})입니다.
좋아요, 소스만 주세요.
高洛峰2017-05-15 16:54:59
Access-Control-Allow-Origin은 교차 도메인 게시 요청 문제를 해결하기 위해 *로만 설정됩니다. 쿠키는 도메인을 교차할 수 없거나 2레벨 도메인 이름을 교차할 수만 있습니다. sf의
과 같이 동일한 1차 도메인 이름 아래의 모든 2차 도메인 이름에 대한 액세스를 허용하도록 지정되었습니다.ringa_lee2017-05-15 16:54:59
ng 프로젝트이므로 로딩 페이지가 하나만 있어야 합니다. Java가 들어오도록 하고 이 페이지로 돌아오세요.
문제는 각도 템플릿을 비동기식으로 로드해야 하는 경우 도메인 간도 발생한다는 점일 수 있습니다. 한 가지 해결책은 위에서 했던 것처럼 원본을 추가하는 것이고, 다른 하나는 템플릿을 스크립트로 직접 패키징하여 직접 추가하는 것입니다