


Bagaimana untuk menyelesaikan masalah rentas domain log masuk tunggal dengan memisahkan bahagian hadapan dan hujung belakang vue+springboot
Kod adalah seperti berikut:
@Configuration public class CorsConfiguration { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurerAdapter() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedHeaders("*") .allowedMethods("*") .allowedOrigins("*"); } }; } }
Konfigurasi ini membenarkan semua pemetaan, semua pengepala permintaan, semua kaedah permintaan dan semua sumber. Selepas menukar konfigurasi, saya memulakan semula projek dengan tegas untuk melihat kesannya. Saya mendapati bahawa tiada cara untuk mengubah hala ke halaman log masuk tunggal Memandangkan ralat penyemak imbas disebabkan oleh merentas domain, saya mula-mula memuat naik kod pemintas log masuk saya
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //用户已经登录 if (request.getSession().getAttribute("user") != null) { return true; } //从单点登录返回之后的状态,本系统还不处于登录状态 //根据code值去获取access_token,然后再根据access_token去获取用户信息,并将用户信息存到session中 String state = request.getParameter("state"); String uri = getUri(request); if (isLoginFromSSO(state)) { String code = request.getParameter("code"); Object cacheUrl = request.getSession().getAttribute(state); if (cacheUrl == null) { response.sendRedirect(uri); return false; } HttpUtil client = new HttpUtil(); StringBuffer sb = new StringBuffer(); sb.append("code=").append(code) .append("&grant_type=").append("authorization_code") .append("&client_id=").append(SSOAuth.ClientID) .append("&client_secret=").append(SSOAuth.ClientSecret) .append("&redirect_uri=").append(URLEncoder.encode((String) cacheUrl)); String resp = client.post(SSOAuth.AccessTokenUrl, sb.toString()); Map<String, String> map = new Gson().fromJson(resp, Map.class); //根据access_token去获取用户信息 String accessToken = map.get("access_token"); HttpUtil http = new HttpUtil(); http.addHeader("Authorization", "Bearer " + accessToken); String encrypt = http.get(SSOAuth.UserUrl); String userinfo = decryptUserInfo(encrypt); //封装成user对象 User user = new Gson().fromJson(userinfo, User.class); request.getSession().setAttribute("user", user); return true; } //跳转到单点登录界面 state = Const._SSO_LOGIN + Const.UNDERLINE + RandomUtil.getUUID(); request.getSession().setAttribute(state, uri); String redirectUrl = buildAuthCodeUrl(uri, state); response.sendRedirect(redirectUrl); return false; }
Kemudian, gunakan vue bahagian hadapan untuk meminta antara muka log masuk bahagian belakang secara terus menggunakan
window.location.href=this.$api.config.baseUrl+"/system/user/login"
Kemudian bahagian hadapan mengakses sistem dan boleh melompat terus ke halaman log masuk tunggal. Tetapi apabila saya memasukkan akaun dan kata laluan dan mengklik untuk log masuk, saya melompat kembali ke sistem dan mendapati bahawa semua antara muka data permintaan tidak dapat diakses secara normal mendapati bahawa semua permintaan tidak membawa maklumat pengguna dan diiktiraf oleh pemintas sebagai tidak dilog masuk, jadi semua permintaan tidak dapat diluluskan.
Mengapa saya log masuk dengan jelas dan pemintas juga menetapkan maklumat pengguna kepada sesi Mengapa kuki hilang? Saya memulakan permintaan sekali lagi dan mendapati bahawa JsessionId bagi setiap permintaan adalah berbeza. Saya telah menyemak banyak maklumat dan mendapati bahawa saya perlu menambah konfigurasi yang membolehkan maklumat pengesahan ditambahkan pada bahagian hadapan
axios.defaults.withCredentials=true;
A. konfigurasi yang sepadan juga perlu dibuat di bahagian belakang allowCredentials(true );
@Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurerAdapter() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedHeaders("*") .allowedMethods("*") .allowedOrigins("*").allowCredentials(true); } }; }
Selepas menambah konfigurasi ini, saya menjalankan proses operasi sekali lagi dan mendapati bahawa saya boleh melompat ke sistem seperti biasa selepas log masuk, dan halaman data juga dipaparkan secara normal.
Apabila saya fikir saya telah selesai, saya tiba-tiba mengklik pada halaman dan data tidak dapat dipaparkan seperti biasa, saya sangat keliru, saya dengan cepat F12 dan menemui kaedah permintaan yang tidak pernah saya lihat sebelum ini, iaitu OPTIONS permintaan. Ternyata kaedah permintaan ini jelas POST, mengapa ia menjadi PILIHAN? Oleh itu, saya memesan beberapa permintaan POST lain dan mendapati bahawa semuanya bertukar menjadi permintaan OPTIONS Saya keliru dan dengan cepat menyemak maklumat permintaan OPTIONS permintaan itu dilaksanakan, penyemak imbas akan memulakan permintaan pra-semakan dahulu Hanya selepas permintaan pra-semak lulus, permintaan rasmi boleh dilaksanakan. Selepas membacanya, saya tiba-tiba menyedari bahawa OPTIONS telah dipintas, jadi saya tidak lagi dapat melaksanakan permintaan POST saya Kemudian saya hanya membiarkan permintaan pra-semak berlalu. Hanya tambahkan penghakiman ini pada pemintas
//option预检查,直接通过请求 if ("OPTIONS".equals(request.getMethod())){ return true; }
Dengan cara ini, jika pemintas mendapati bahawa permintaan itu adalah permintaan pra-semak, ia akan lulus terus dan permintaan POST seterusnya boleh dilaksanakan.
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah rentas domain log masuk tunggal dengan memisahkan bahagian hadapan dan hujung belakang vue+springboot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Menggunakan bootstrap dalam vue.js dibahagikan kepada lima langkah: Pasang bootstrap. Import bootstrap di main.js. Gunakan komponen bootstrap secara langsung dalam templat. Pilihan: Gaya tersuai. Pilihan: Gunakan pemalam.

Anda boleh menambah fungsi ke butang VUE dengan mengikat butang dalam templat HTML ke kaedah. Tentukan kaedah dan tulis logik fungsi dalam contoh Vue.

Pilihan Watch di Vue.js membolehkan pemaju mendengar perubahan dalam data tertentu. Apabila data berubah, tontonkan mencetuskan fungsi panggil balik untuk melakukan paparan kemas kini atau tugas lain. Pilihan konfigurasinya termasuk segera, yang menentukan sama ada untuk melaksanakan panggilan balik dengan serta -merta, dan mendalam, yang menentukan sama ada untuk mendengarkan secara rekursif terhadap objek atau tatasusunan.

Pembangunan pelbagai halaman Vue adalah cara untuk membina aplikasi menggunakan rangka kerja VUE.JS, di mana permohonan dibahagikan kepada halaman berasingan: Penyelenggaraan kod: Memisahkan aplikasi ke dalam beberapa halaman boleh menjadikan kod lebih mudah untuk dikendalikan dan diselenggarakan. Modularity: Setiap halaman boleh digunakan sebagai modul yang berasingan untuk penggunaan semula dan penggantian mudah. Routing mudah: Navigasi antara halaman boleh diuruskan melalui konfigurasi penghalaan mudah. Pengoptimuman SEO: Setiap halaman mempunyai URL sendiri, yang membantu SEO.

Terdapat tiga cara untuk merujuk kepada fail JS dalam vue.js: Secara langsung tentukan jalan menggunakan & lt; skrip & gt; tag ;; import dinamik menggunakan cangkuk kitaran hayat yang dipasang (); dan mengimport melalui Perpustakaan Pengurusan Negeri VUEX.

Vue.js mempunyai empat kaedah untuk kembali ke halaman sebelumnya: $ router.go (-1) $ router.back () menggunakan & lt; router-link to = & quot;/& quot; Komponen Window.History.Back (), dan pemilihan kaedah bergantung pada tempat kejadian.

Terdapat tiga kaedah umum untuk vue.js untuk melintasi tatasusunan dan objek: Arahan V-untuk digunakan untuk melintasi setiap elemen dan membuat templat; Arahan V-mengikat boleh digunakan dengan V-untuk menetapkan nilai atribut secara dinamik untuk setiap elemen; dan kaedah .map boleh menukar elemen array ke dalam tatasusunan baru.

Terdapat dua cara untuk melompat elemen div di Vue: Gunakan Vue Router dan tambahkan komponen router-link. Tambah pendengar acara @Click dan panggil ini. $ Router.push () kaedah untuk melompat.
