cari

Rumah  >  Soal Jawab  >  teks badan

angular.js - Kehilangan sesi merentas domain

Saya menggunakan projek sudut yang dimulakan berdasarkan pelayan HTTP nodejs, url log masuk: http://localhost:9000/#/login
Url log masuk projek kejuruteraan Java: http://localhost:8060/login
Dan sekarang saya hanya mahu memanggil antara muka projek projek java pada projek sudut, dan projek java kini hanya akan menyediakan data json yang dikembalikan untuk projek sudut
Apabila masalah merentas domain berlaku semasa proses, saya menyediakan pemintas secara seragam pada projek Java dan menetapkan pengepala respons apabila permintaan baharu dipanggil:
response.setHeader("Access-Control-Allow-Origin" , "*" ); Tetapi masalah kehilangan sesi tidak diselesaikan
Maksudnya, apabila saya memanggil antara muka log masuk dalam projek sudut untuk log masuk, pelayan akan membuat sesi dan mengembalikan data json seperti maklumat pengguna dan maklumat kebenaran, serta mengembalikan jsessionid kepada klien; Seperti yang ditunjukkan dalam gambar:


Log masuk berjaya dan lompat ke
http://localhost:9000/#/home
Tetapi apabila saya mengklik pada menu kiri pada halaman utama untuk melaksanakan antara muka lain projek java, seperti menanyakan antara muka senarai pengguna, ia telah dipintas dan kembali ke antara muka log masuk, kerana jsessionid yang sepadan tidak dapat ditemui dalam pengepala permintaan , yang bersamaan dengan pengguna semasa masih Belum log masuk Prinsipnya ialah: setiap kali antara muka dipanggil dan permintaan baharu dikeluarkan, ia akan dinilai terlebih dahulu sama ada URL membawa jsession Jika tidak, ia akan dinilai bahawa terdapat jsession dalam kuki dalam pengepala permintaan wujud, ia akan dihantar ke latar belakang, dan latar belakang akan memperolehnya melalui jsession. Dapatkan sesi yang sepadan; walau bagaimanapun, jika jsession tidak wujud atau sesi yang sepadan tidak boleh diperolehi melalui jsession, sesi baharu akan dibuat



Saya ingin bertanya bagaimana untuk mengelakkan kehilangan sesi yang disebabkan oleh panggilan antara muka merentas domain?

世界只因有你世界只因有你2796 hari yang lalu796

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