cari

Rumah  >  Soal Jawab  >  teks badan

angular.js - 跨域造成session丢失

我部署了一个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丢失呢?

世界只因有你世界只因有你2744 hari yang lalu764

membalas semua(4)saya akan balas

  • 迷茫

    迷茫2017-05-15 16:54:59

    Jadi belum ada penyelesaian. .

    kemas kini
    Saya telah menyelesaikannya. Bahagian belakang ialah Java springboot, bahagian hadapan adalah sudut, dan komunikasi json merentas domain digunakan.
    Mod Cors, konfigurasikan corsfilter, kodnya adalah seperti berikut:

    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() {}
    
    }

    Konfigurasi ini harus ditemui di banyak tempat Perbezaan utama ialah dua perkara:
    1. response.setHeader("Access-Control-Allow-Credentials","true"); //Sama ada kuki disokong merentas domain
    2. response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));

    Pertama sekali, selepas mengkonfigurasi kelayakan-benar, jika membenarkan-asal ditetapkan kepada *, ralat akan dilaporkan semasa melintasi domain, mengatakan bahawa asal tidak boleh ditetapkan kepada kad bebas * kerana bukti kelayakan dibenarkan, jadi ia juga mungkin untuk menetapkannya kepada domain mudah , kaedah penulisan ini harus mencapai kesan mana-mana domain.

    Kemudian bahagian sudut juga perlu menetapkan sesuatu, sebagai contoh~

    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');
          }
        })
      });

    Nah, ini ialah $http.get(url, {withCredentials: true}).
    Ok, itu sahaja.

    balas
    0
  • 高洛峰

    高洛峰2017-05-15 16:54:59

    Menetapkan Access-Control-Allow-Origin kepada * hanya digunakan untuk menyelesaikan masalah permintaan siaran merentas domain, atau kuki hanya boleh merentas nama domain peringkat kedua . , semasa menulis, ia boleh ditentukan untuk membenarkan akses kepada semua nama domain peringkat kedua di bawah nama domain peringkat pertama yang sama, seperti sf

    balas
    0
  • ringa_lee

    ringa_lee2017-05-15 16:54:59

    Memandangkan ia adalah projek ng, anda sepatutnya hanya mempunyai satu halaman memuatkan. Hanya biarkan Java membuat pintu masuk untuk anda dan kembali ke halaman ini.

    Masalahnya mungkin jika templat sudut anda perlu dimuatkan secara tidak segerak, ia juga akan merentas domain Satu penyelesaian ialah menambah asal seperti yang anda lakukan di atas, dan satu lagi ialah membungkus templat secara terus ke dalam skrip dan menambahnya langsung

    balas
    0
  • 黄舟

    黄舟2017-05-15 16:54:59

    Adakah penyelesaiannya?

    balas
    0
  • Batalbalas