τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Ανατρέξτε στο παρακάτω άρθρο για τον λόγο: Ο σωστός τρόπος επίλυσης προβλημάτων μεταξύ τομέων διαχωρίζοντας το front-end και το back-end του sa-token
https://mp.weixin.qq.com/s/96WbWL28T5_-xzyCfJ7Stg
https://blog.csdn.net/qq_34905631/article/details/140233780?spm=1001.2014.3001.5501
Παρόλο που αυτό το άρθρο βρήκε τη σωστή στάση του σώματος μετά από πολλές προσπάθειες, η βασική αιτία του προβλήματος δεν βρέθηκε. Στη συνέχεια, μετά από λίγη σκέψη και εξερεύνηση, αναρωτήθηκα αν θα μπορούσε να προσομοιωθεί τοπικά αυτό το cross-domain και μετά άρχισα να το αναζητώ Ο Wang, το μπροστινό προσωπικό του έργου, προσομοίωσε όντως τοπικό cross-domain Στο έργο, διαχώρισε το προηγούμενο sa-token front-end και back-end για να λύσει τη σωστή στάση του cross-domain και αναπαρήγαγε το πρόβλημα. αφού σχολίασε το SimpleCORSFilter στο άρθρο.
Η διαμόρφωση μεταξύ τομέων του spring5.2.15.RELEASE official mvc είναι η εξής:
https://docs.spring.io/spring-framework/docs/5.2.15.RELEASE/spring-framework-reference/web.html#mvc-cors-intro
Ακολουθήστε την επίσημη μέθοδο που συνδέεται παραπάνω και, στη συνέχεια, προσθέστε μια κλάση CustomCorsFilter ως εξής:
package xxxx.config;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CustomCorsFilter extends CorsFilter {
public CustomCorsFilter() {
super(corsConfigurationSource());
}
private static CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.addAllowedOrigin("*"); // 允许访问的域名,例如 http://localhost:8080
configuration.addAllowedHeader("*"); // 允许所有请求头
configuration.addAllowedMethod("*"); // 允许所有请求方法
configuration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
Η ρύθμιση παραμέτρων του CustomCorsFilter έχει επαληθευτεί ως έγκυρη σε ένα έργο στο οποίο εργάστηκα, ωστόσο, σε ένα πρόσφατο έργο, είναι άχρηστη η χρήση αυτής της διαμόρφωσης κλάσης CustomCorsFilter για την επίλυση προβλημάτων μεταξύ τομέων. Στο παραπάνω άρθρο σχετικά με τον σωστό τρόπο επίλυσης προβλημάτων μεταξύ τομέων διαχωρίζοντας το front-end και το back-end του sa-token, η επαλήθευση κλάσης CustomCorsFilter ήταν πράγματι άκυρη , (Το SimpleCORSFilter πρέπει να σχολιαστεί, επειδή αυτό το SimpleCORSFilter μπορεί να χρησιμοποιηθεί μετά την επαλήθευση, το μπροστινό μέρος προσομοιώνει αιτήματα μεταξύ τομέων, στον ακόλουθο κώδικα της κλάσης CorsFilter:
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
CorsConfiguration corsConfiguration = this.configSource.getCorsConfiguration(request);
boolean isValid = this.processor.processRequest(corsConfiguration, request, response);
//关键就是这里,在这里打上断点
if (!isValid || CorsUtils.isPreFlightRequest(request)) {
return;
}
filterChain.doFilter(request, response);
}
Τοποθετήστε επίσης ένα σημείο διακοπής στη μέθοδο CorsUtils.isPreFlightRequest:
public static boolean isPreFlightRequest(HttpServletRequest request) {
return (HttpMethod.OPTIONS.matches(request.getMethod()) &&
request.getHeader(HttpHeaders.ORIGIN) != null &&
request.getHeader(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD) != null);
}
Στη συνέχεια, το στιγμιότυπο οθόνης του σημείου διακοπής έχει ως εξής:
Η διεπαφή σύνδεσης είναι ένα σύνθετο αίτημα μεταξύ τομέων με http συν όνομα τομέα και θα σταλεί ένα αίτημα προανίχνευσης (αίτημα OPTIONS).
Στο έργο που ενσωματώθηκε με το sa-token, έθεσα ένα σημείο διακοπής στη μέθοδο doFilterInternal του OncePerRequestFilter και βρήκα τα ακόλουθα φίλτρα:
Μπορεί να φανεί ότι το CustomCorsFilter που προσαρμόσαμε παραπάνω εκτελείται πρώτα και τα δύο φίλτρα που σχετίζονται με το sa-token: saPathCheckFilterForServlet και SaServletFilter εκτελούνται αργότερα, επομένως άλλες προηγούμενες εικασίες έχουν επιβεβαιωθεί καλά. Το σημείο διακοπής πηγαίνει στη μέθοδο doFilterInternal του CorsFil :
//关键就是这里,在这里打上断点
if (!isValid || CorsUtils.isPreFlightRequest(request)) {
return;
}
Το πρόβλημα βρίσκεται στον παρακάτω κώδικα:
CorsUtils.isPreFlightRequest(request)
Αυτή η γραμμή κώδικα επέστρεψε true, οπότε δεν εκτελέστηκαν όλα τα επόμενα φίλτρα, επομένως το αίτημα δεν μπορούσε να φτάσει στη διεπαφή. Το πρόγραμμα περιήγησης εξακολουθούσε να αναφέρει προβλήματα μεταξύ τομέων. , διαπιστώθηκε ότι μετά από ένα σύνθετο αίτημα αποστολής ενός αιτήματος προ-ανίχνευσης (OPTIONS αίτημα) σε τομείς, το Origin θα οριστεί με ανεξήγητο τρόπο:
http://localhost:3000
Αυτό ήταν πολύ περίεργο, γι' αυτό ζήτησα από τον συνάδελφό μου στο front-end Lao Wangbang να ελέγξει πού ορίστηκε αυτή η τιμή και βρήκα τα εξής:
Η διεπαφή δεν ορίζει το Origin, αλλά ορίζει μόνο τις ακόλουθες παραμέτρους:
//设置axios跨域访问
axios.defaults.withcredentials = true // 设置cross跨域 并设置访问权限 允许跨域携带cookie信息axios.defaults.crossDomain=true //设置axios跨域的配置
Στην παραπάνω εικόνα, υπάρχει μόνο μία τιμή αναφοράς που συμπίπτει με την τιμή Προέλευσης.
https://blog.csdn.net/qq_55316925/article/details/128571809
Μου έδωσε πολλές ιδέες, οπότε το σκέφτηκα και αποδείχτηκε ότι το CustomCorsFilter που είχε ρυθμιστεί στο backend ήταν αποτελεσματικό. Μπορώ να αλλάξω τον πηγαίο κώδικα του CorsFilter στο front-end Lao Wang , και οι δύο μέθοδοι είναι εφικτές και καθένας μπορεί να λύσει το πρόβλημα μεταξύ των τομέων cors.
Τροποποιήστε τον πηγαίο κώδικα του CorsFilter στο backend
Προσθέστε ένα νέο πακέτο org.springframework.web.filter στο src.main.java κάτω από το έργο
Στη συνέχεια, αντιγράψτε τον πηγαίο κώδικα του CorsFilter και τοποθετήστε τον κάτω από το πακέτο org.springframework.web.filter που δημιουργήθηκε πρόσφατα και, στη συνέχεια, μπορείτε να τροποποιήσετε τον πηγαίο κώδικα του CorsFilter.
/*
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.web.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.Assert;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.CorsProcessor;
import org.springframework.web.cors.CorsUtils;
import org.springframework.web.cors.DefaultCorsProcessor;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
/**
* {@link javax.servlet.Filter} that handles CORS preflight requests and intercepts
* CORS simple and actual requests thanks to a {@link CorsProcessor} implementation
* ({@link DefaultCorsProcessor} by default) in order to add the relevant CORS
* response headers (like {@code Access-Control-Allow-Origin}) using the provided
* {@link CorsConfigurationSource} (for example an {@link UrlBasedCorsConfigurationSource}
* instance.
*
* <p>This is an alternative to Spring MVC Java config and XML namespace CORS configuration,
* useful for applications depending only on spring-web (not on spring-webmvc) or for
* security constraints requiring CORS checks to be performed at {@link javax.servlet.Filter}
* level.
*
* <p>This filter could be used in conjunction with {@link DelegatingFilterProxy} in order
* to help with its initialization.
*
* @author Sebastien Deleuze
* @since 4.2
* @see <a href="https://www.w3.org/TR/cors/">CORS W3C recommendation</a>
*/
public class CorsFilter extends OncePerRequestFilter {
private final CorsConfigurationSource configSource;
private CorsProcessor processor = new DefaultCorsProcessor();
/**
* Constructor accepting a {@link CorsConfigurationSource} used by the filter
* to find the {@link CorsConfiguration} to use for each incoming request.
* @see UrlBasedCorsConfigurationSource
*/
public CorsFilter(CorsConfigurationSource configSource) {
Assert.notNull(configSource, "CorsConfigurationSource must not be null");
this.configSource = configSource;
}
/**
* Configure a custom {@link CorsProcessor} to use to apply the matched
* {@link CorsConfiguration} for a request.
* <p>By default {@link DefaultCorsProcessor} is used.
*/
public void setCorsProcessor(CorsProcessor processor) {
Assert.notNull(processor, "CorsProcessor must not be null");
this.processor = processor;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
CorsConfiguration corsConfiguration = this.configSource.getCorsConfiguration(request);
boolean isValid = this.processor.processRequest(corsConfiguration, request, response);
//修改的源码是将CorsUtils.isPreFlightRequest(request)这行代码移除,就是因为复杂请求跨域发了预检测请求,浏览器的referrer-policy引用者策略会携带一个值,后端处理之后会将这个值赋值给请求头的Orgin属性上,移除这行代码之后就可以正常访问到登录接口了,前端也没有报跨域了。
if (!isValid) {
return;
}
filterChain.doFilter(request, response);
}
}
Προσθέστε τον ακόλουθο κώδικα στη διεπαφή: απενεργοποιήστε ή καταργήστε την πολιτική παραπομπής πολιτικής παραπομπής
https://blog.csdn.net/qq_49810363/article/details/111036180
Ο νέος κωδικός έχει ως εξής:
<meta name="referrer" content="never">
Η πολιτική παραπομπής πολιτικής του προγράμματος περιήγησης είναι επίσης για λόγους ασφαλείας Το πρόγραμμα περιήγησης που χρησιμοποιώ είναι το πρόγραμμα περιήγησης Chrome.
Μετά από συνεχείς προσπάθειες και ψάξιμο, το πρόβλημα της ανάπτυξης μεταξύ τομέων cors προέκυψε μετά την ενσωμάτωση του sa-token στο έργο Γενικά, οι προδιαγραφές του πρωτοκόλλου μεταξύ τομέων cors δεν επιτρέπουν αυτή τη λειτουργία -η βιβλιοθήκη λύσεων end δεν επιτρέπει λειτουργίες αιτημάτων που δεν ακολουθούν τις προδιαγραφές του πρωτοκόλλου μεταξύ τομέων cors, επομένως μπορείτε να χρησιμοποιήσετε το sa-token για να διαχωρίσετε τις λύσεις front-end και back-end στη σωστή στάση των λύσεων μεταξύ τομέων Διαμορφώστε ένα SimpleCORSFilter, γράψτε συγκεκριμένες παραμέτρους και επεξεργαστείτε το αίτημα προανίχνευσης επιστρέφει έναν κωδικό κατάστασης 200 ή μπορείτε να χρησιμοποιήσετε οποιαδήποτε από τις δύο μεθόδους σε αυτό το άρθρο για να λύσετε το πρόβλημα μεταξύ τομέων cors Το διορθώνω μετά την αναπαραγωγή του αιτήματος μεταξύ τομέων στο σημείο διακοπής, εάν πιστεύετε ότι μπορείτε να ακολουθήσετε τη μέθοδο σε αυτό το άρθρο, αναπαράγετε το αίτημα μεταξύ τομέων τοπικά και, στη συνέχεια, διορθώστε το σημείο διακοπής σφαλμάτων για να δείτε εάν είναι πρόβλημα. Η γραμμή CorsUtils.isPreFlightRequest(αίτημα) του corsFilter Γενικά, αυτό το πρόβλημα μεταξύ τομέων είναι μεγάλο πρόβλημα για τα προγράμματα περιήγησης Ένα απλό αίτημα προς το corsFilter δεν θα αποτύχει. Δεδομένου ότι η πολιτική παραπομπής πολιτικής παραπομπής του προγράμματος περιήγησης θα φέρει μια τιμή, μετά την επεξεργασία του back-end, αυτή η τιμή θα εκχωρηθεί στο χαρακτηριστικό Origin της κεφαλίδας αιτήματος, με αποτέλεσμα η γραμμή κώδικα CorsUtils.isPreFlightRequest(αίτημα) του corsFilter να επιστρέψει true. και μετά επιστρέψτε Ως αποτέλεσμα, το doFilter της επόμενης σειράς φίλτρων δεν εκτελείται και δεν υπάρχει πρόσβαση στη διεπαφή του back-end και η σελίδα του προγράμματος περιήγησης στο μπροστινό μέρος εξακολουθεί να αναφέρει προβλήματα μεταξύ τομέων , αυτό το πρόβλημα είναι πραγματικά ενοχλητικό. Η μέθοδος https δεν λειτουργεί μεταξύ των τομέων, επειδή το https ακούει στη θύρα 443 και υποθέτω ότι αυτό απαιτεί τη ρύθμιση παραμέτρων του πιστοποιητικού Είναι το ίδιο στο Διαδίκτυο Κανένα από τα άρθρα σε αυτό το άρθρο δεν έχει λύση σε αυτήν την κατάσταση πρωτότυπο Παρακαλώ, προσθέστε την αρχική πηγή. Ελπίζω ότι η κοινή χρήση μου μπορεί να σας εμπνεύσει και να σας βοηθήσει.