प्रौद्योगिकी साझेदारी

sa-token एकीकृत्य, अग्रे-अन्तं पृष्ठ-अन्तं च परिनियोजनं पृथक् कुर्वन्तु तथा च cross-domain विफलतायाः वास्तविककारणं समाधानं कर्तुं corsFliter विन्यस्यताम् ।

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

१ परिचयः

कृपया कारणार्थं निम्नलिखितलेखं पश्यन्तु: sa-token इत्यस्य अग्रे-अन्तं पृष्ठ-अन्तं च पृथक् कृत्वा पार-डोमेन-समस्यानां समाधानस्य समीचीनः उपायः

https://mp.weixin.qq.com/s/96WbWL28T5_-xzyCfJ7Stg
https://blog.csdn.net/qq_34905631/article/details/140233780?spm=1001.2014.3001.5501
  • 1
  • 2

यद्यपि अयं लेखः बहुप्रयासानां अनन्तरं सम्यक् मुद्रां प्राप्तवान् तथापि समस्यायाः मूलकारणं न प्राप्तम् ततः किञ्चित् चिन्तनस्य अन्वेषणस्य च अनन्तरं मया चिन्तितम् यत् एतत् क्रॉस्-डोमेन् स्थानीयतया अनुकरणं कर्तुं शक्यते वा इति, ततः अहं तत् अन्वेष्टुं आरब्धवान् ततः परियोजनायाः अग्रभागस्य कर्मचारी वाङ्गः खलु स्थानीयक्रॉस्-डोमेनस्य अनुकरणं कृतवान् परियोजनायां सः क्रॉस्-डोमेनस्य सम्यक् मुद्रायाः समाधानार्थं पूर्वस्य सा-टोकन् अग्रभागस्य पृष्ठभागस्य च पृथक्करणं कृतवान्, समस्यां च पुनः प्रदर्शितवान् लेखे SimpleCORSFilter इत्यस्य विषये टिप्पणीं कृत्वा।

2. समस्यायाः पुनरावृत्तिः

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
  • 1

उपरि लिङ्क् कृतं आधिकारिकं पद्धतिं अनुसृत्य, ततः 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;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

CustomCorsFilter इत्यस्य विन्यासः मया कार्यं कृतस्य परियोजनायां वैधः इति सत्यापितः अस्ति तथापि, अद्यतनप्रकल्पे, क्रॉस्-डोमेन समस्यानां समाधानार्थं एतस्य CustomCorsFilter वर्गविन्यासस्य उपयोगः व्यर्थः अस्ति वा? sa-token front-end तथा back-end पृथक् कृत्वा cross-domain समस्यानां समाधानस्य समीचीनमार्गे उपर्युक्ते लेखे CustomCorsFilter वर्गसत्यापनं वास्तवमेव अमान्यम् आसीत् यदा अहं परियोजनायां 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);
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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);
	}
  • 1
  • 2
  • 3
  • 4
  • 5

ततः ब्रेकपॉइण्ट् स्क्रीनशॉट् यथा भवति ।

प्रवेश-अन्तरफलकं http plus डोमेन-नाम सहितं जटिलं पार-डोमेन-अनुरोधं भवति, तथा च पूर्व-परिचय-अनुरोधः (OPTIONS अनुरोधः) प्रेषितः भविष्यति ।

cors त्रुटिनिवारण चित्र 2

sa-token इत्यनेन सह एकीकृते परियोजनायां अहं OncePerRequestFilter इत्यस्य doFilterInternal मेथड् इत्यत्र एकं ब्रेकपॉइण्ट् सेट् कृत्वा निम्नलिखित-छिद्राणि प्राप्तवान् ।

cors त्रुटिनिवारण चित्र 2

द्रष्टुं शक्यते यत् उपरि अस्माभिः अनुकूलितं CustomCorsFilter प्रथमं निष्पादितं भवति, तथा च sa-token इत्यनेन सह सम्बद्धौ फ़िल्टरौ: saPathCheckFilterForServlet तथा ​​SaServletFilter पश्चात् निष्पादितौ भवतः, अतः अन्ये पूर्वानुमानाः सम्यक् पुष्टीकृताः सन्ति : १.

       //关键就是这里,在这里打上断点
		if (!isValid || CorsUtils.isPreFlightRequest(request)) {
			return;
		}
  • 1
  • 2
  • 3
  • 4

समस्या निम्नलिखितसङ्केते अस्ति ।

CorsUtils.isPreFlightRequest(request)
  • 1

कोडस्य एषा पङ्क्तिः सत्यं प्रत्यागच्छत्, अतः अनन्तरं सर्वे फ़िल्टराः निष्पादिताः न आसन्, अतः ब्राउजर् अद्यापि क्रॉस्-डोमेन् समस्याः प्रतिवेदयति स्म । .

http://localhost:3000
  • 1

एतत् अतीव विचित्रम् आसीत्, अतः अहं मम अग्रे-अन्त-सहकारिणं लाओ वाङ्गं पृष्टवान् यत् एतत् मूल्यं कुत्र निर्धारितम् इति पश्यतु, ततः निम्नलिखितम् अवाप्तवान् ।

cors त्रुटिनिवारण चित्र 3

अग्रभागः Origin इति सेट् न करोति, अपितु केवलं निम्नलिखितमापदण्डान् सेट् करोति ।

//设置axios跨域访问
axios.defaults.withcredentials = true // 设置cross跨域 并设置访问权限 允许跨域携带cookie信息axios.defaults.crossDomain=true //设置axios跨域的配置
  • 1
  • 2

उपरिष्टाद् चित्रे केवलं एकं Referer मूल्यं अस्ति यत् Origin मूल्येन सह मेलनं करोति किं वास्तवमेव एतत् केवलं संयोगः एव, अतः अहं निम्नलिखितम् लेखं पठितवान्।

https://blog.csdn.net/qq_55316925/article/details/128571809
  • 1

एतेन मम बहु विचाराः प्राप्ताः, अतः अहं तस्य विषये चिन्तितवान्, तथा च एतत् निष्पन्नं यत् पृष्ठभागे विन्यस्तं CustomCorsFilter प्रभावी आसीत् किं अहं CorsFilter स्रोतसङ्केतं परिवर्तयितुं शक्नोमि, यत् मया सत्यापितं च the front-end Lao Wang , उभयविधौ व्यवहार्यौ स्तः, तथा च एकः cors cross-domain समस्यायाः समाधानं कर्तुं शक्नोति।

3.समाधानम्

3.1 विधिः 1: पृष्ठभागे CorsFilter स्रोतसङ्केतं परिवर्तयन्तु

पृष्ठभागे CorsFilter स्रोतसङ्केतं परिवर्तयन्तु

परियोजनायाः अन्तर्गतं src.main.java इत्यस्य अधः नूतनं org.springframework.web.filter संकुलं योजयन्तु

ततः 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);
	}

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97

3.2 विधिः 2: अग्रभागे ब्राउजर् रेफरर-नीतिं निष्क्रियं कुर्वन्तु अथवा निष्कासयन्तु

अग्रभागे निम्नलिखितसङ्केतं योजयन्तु: referrer-policy` referrer नीतिं अक्षमं कुर्वन्तु अथवा निष्कासयन्तु

https://blog.csdn.net/qq_49810363/article/details/111036180
  • 1

नूतनः कोडः निम्नलिखितरूपेण अस्ति ।

<meta name="referrer" content="never">
  • 1

cors त्रुटिनिवारण चित्र 4

ब्राउजर् इत्यस्य रेफरर-नीति-रेफरर-नीतिः अपि सुरक्षाकारणात् अस्ति ।

4. सारांशः

नित्यप्रयासानां टटोलनस्य च अनन्तरं परियोजनायां sa-token इत्यस्य एकीकरणानन्तरं cors cross-domain deployment इत्यस्य समस्या अभवत् सामान्यतया cors cross-domain protocol इत्यस्य विनिर्देशाः एतत् कार्यं न अनुमन्यन्ते -end solution library अनुरोधसञ्चालनस्य अनुमतिं न ददाति ये cors cross-domain प्रोटोकॉलस्य विनिर्देशानां अनुसरणं न कुर्वन्ति, अतः cross-domain solutions इत्यस्य समीचीनमुद्रायाः कृते front-end तथा back-end समाधानं पृथक् कर्तुं sa-token इत्यस्य उपयोगं कर्तुं शक्नुवन्ति . अहं ब्रेक-बिन्दौ क्रॉस्-डोमेन-अनुरोधं पुनः प्रदर्शयित्वा तस्य त्रुटिनिवारणं करोमि समाधानं, यदि भवान् मन्यते यत् भवान् अस्मिन् लेखे विधिं अनुसरणं कर्तुं शक्नोति, तर्हि क्रॉस्-डोमेन-अनुरोधं स्थानीयतया पुनः प्रदर्शयतु ततः विच्छेदबिन्दुं त्रुटिनिवारणं करोमि यत् एतत् पश्यतु यत् एतत् समस्या अस्ति वा इति the CorsUtils.isPreFlightRequest(request) line of corsFilter सामान्यतया, एषा cors क्रॉस्-डोमेन समस्या ब्राउजर् कृते एकः सरलः अनुरोधः विफलः न भविष्यति। .यतोहि ब्राउजर् इत्यस्य रेफरर-नीति-रेफरर-नीतिः मूल्यं वहति, पृष्ठ-अन्त-प्रक्रियाकरणस्य अनन्तरं, एतत् मूल्यं अनुरोध-शीर्षकस्य Origin विशेषतायां नियुक्तं भविष्यति, येन corsFilter इत्यस्य कोडस्य CorsUtils.isPreFlightRequest(request) इत्यस्य रेखा सत्यं प्रत्यागच्छति तथा ततः प्रत्यागच्छति फलतः, ​​Filters इत्यस्य अनन्तरं श्रृङ्खलायाः doFilter निष्पादितं भवति, तथा च Back-end interface - मध्ये प्रवेशः नास्ति, तथा च front-end browser page अद्यापि cross-domain समस्यानां सूचनां ददाति , एषा समस्या वस्तुतः कष्टप्रदः अस्ति। https विधिः क्रॉस्-डोमेन् कार्यं न करोति, यतः https पोर्ट् 443 शृणोति तथा च प्रमाणपत्रस्य आवश्यकता अस्ति अयं लेखः आरोपं स्वच्छं करोति यत् sa-token एकीकृत्य corsFilter विन्यासः It अमान्यः भविष्यति is the same on the internet original कृपया पुनः मुद्रणं कृत्वा मूलस्रोतः योजयतु आशासे मम साझेदारी भवन्तं प्रेरयितुं साहाय्यं कर्तुं च शक्नोति।