لا تعمل مشاريع التمهيد الزاوي والربيعي المنشورة على اللون الأزرق السماوي كما هو متوقع


لقد قمت بنشر مشروع angular في خدمة التطبيق الخاصة به وقمت أيضًا بنشر Spring Boot في خدمة التطبيق الخاصة به ويعمل التطبيقان بشكل جيد محليًا ولكن المشكلة تأتي في الإنتاج وأتلقى هذا الخطأ “تم حظر طلب Cross-Origin: نفس سياسة الأصل لا تسمح بقراءة المورد البعيد على https://mineralsportal-api.azurewebsites.us/auth_api/authenticate. (السبب: رأس CORS ‘Access-Control-Allow-Origin’ مفقود). رمز الحالة: 503” لا أعرف أين يأتي الخطأ منذ أن قمت بتكوين فئة cross-origin لتمكين مشاركة الموارد وفئة corsFilter في التمهيد الربيعي ولكني أتلقى هذا الخطأ في azure (الإنتاج) على الرغم من أنه يعمل بشكل جيد محليًا.

ما حاولت:

هذه هي فئة corsConfig الخاصة بي

@Configuration
public class CorsConfig {
    @Bean
    public WebMvcConfigurer corsConfigurer(){
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE")
                    .allowedOrigins("*")
                    .allowedHeaders("*");
            }
        };
    }
}

هذه هي فئة corsFilter الخاصة بي

@Component
public class CorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, PATCH");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    response.setHeader("Access-Control-Expose-Headers", "Location");
    chain.doFilter(req, res);
    }
    
    @Override
    public void init(FilterConfig filterConfig) {}

    @Override
    public void destroy() {}

}

هذه هي فئة SecurityConfig الخاصة بي

@Configuration
@EnableWebSecurity
@SuppressWarnings("deprecation")
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserService userService;

    @Autowired
    private RequestFilter requestFilter;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService);
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    http.cors().disable();
    http.csrf().disable();
    http.authorizeRequests().antMatchers("/auth_api/authenticate").permitAll().anyRequest().authenticated()
    .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    http.addFilterBefore(requestFilter, UsernamePasswordAuthenticationFilter.class);
    }
}

بعد الكثير من البحث على Google، لم أتمكن من الحصول على أفضل إجابة يمكن أن تساعدني في حل المشكلة، وأي اقتراحات ستكون موضع تقدير كبير.

وهل هناك أي وسيلة في Azure يمكنني من خلالها نشر كلا التطبيقين للتشغيل على نفس خدمة التطبيق (التمهيد الزاوي + الربيع) دون تجميعهما في نفس ملف الجرة؟

الحل 1

المشكلة ليست في الكود الخاص بك، بل المشكلة في النشر الخاص بك. لقد ذكرت أنك قمت بنشر تطبيقك على Azure، وهذا يجلب مجموعة التوقعات الخاصة به. في الأساس، يتم حظر طلب CORS بواسطة Azure، وليس بواسطة التطبيق الخاص بك. ما عليك القيام به هو إدارة قدرة CORS بنفسك – قم بإلقاء نظرة على الوثائق هنا[^] لفهم كيف يمكنك إدارة CORS في Azure.

[Edit – I posted this response without seeing that this was an old question. The answer still stands though, and could be useful to others in the future.]

コメント

タイトルとURLをコピーしました