Я новичок в услугах весенней загрузки. Я разработал некоторые rest api в весенней загрузке, используя проект maven.
Я успешно разработал Получать и Почта Api. Мой метод ПОЛУЧАТЬ работает правильно в почтальоне и мобильном телефоне. когда я пытаюсь использовать метод post от почтальона, он работает правильно, но с мобильного телефона он дает 403 запрещенную ошибку.
Это моя конфигурация:
spring.datasource.url = jdbc:mysql://localhost/sampledb?useSSL=false
spring.datasource.username = te
spring.datasource.password = test
spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQL5InnoDBDialect
Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = update
Пожалуйста, посоветуйте мне, как решить ошибку.
Пожалуйста, добавьте детали вашей конфигурации весенней загрузки.
я отправляю только тип контента от почтальона и мобильного @desoss
пожалуйста, приложите журналы, Spring имеет удивительно читаемые сообщения об ошибках в журналах;)
Это мои конфигурации: # spring.datasource.url = jdbc: mysql: //192.168.4.2/maha? UseSSL = false # spring.datasource.username = test # spring.datasource.password = test @ 123 # # ### Свойства Hibernate ## Диалект SQL позволяет Hibernate лучше генерировать SQL для выбранной базы данных # spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect # ## Hibernate ddl auto (create, create-drop, validate, update ) # spring.jpa.hibernate.ddl-auto = обновить @JannikWeichert
Я не знаю вашей конфигурации, но если на вашем устройстве вы отправляете те же заголовки, URI и HttpMethod почтальона, это должно работать. (Ури прав, правда?: D)
Пожалуйста, отредактируйте свой вопрос и используйте правильный формат. В противном случае это не читается. Кроме того, добавьте свой WebConfiguration.
я обновил свой вопрос @ JannikWeichert
прикрепите скриншот от почтальона и из программы, которую вы используете на своем мобильном телефоне. Должна быть какая-то разница. Возможно, что запросы не работают извне localhost (настройки безопасности разработчика), но тогда GET тоже не будет работать
Get корректно работает в мобиле и почтальоне
Я знаю, приложите пожалуйста скриншоты
Возможные причины:
Подскажите, пожалуйста, как добавить запрос опции? @desoss
Я обновил пункт 4 ... дайте мне знать, работает ли с spring.mvc.dispatch-options-request = true.
да, я пытаюсь с этим. я дам вам знать, если сработало
Да, вы правы - запрос POST от Postman считался CORS, но просто интересно, почему запросы GET от Postman проходили, даже если CORS отключен?
вам нужно отключить защиту csrf, потому что она включена по умолчанию в Spring Security: здесь вы можете увидеть код, разрешающий происхождение cors.
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception{
http.cors().and().csrf().disable();
}
@Bean
CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("*"));
configuration.setAllowedMethods(Arrays.asList("*"));
configuration.setAllowedHeaders(Arrays.asList("*"));
configuration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
отключение csrf сделало мои запросы POST успешными! какое облегчение.
Спасибо, мой друг! Вы сэкономили мне время!
У меня была такая же ситуация в сочетании с аутентификацией на основе JWT. Это решение сработало для меня с одним дополнением: мне пришлось разрешить передачу запроса «OPTIONS» без JWT в заголовке авторизации.
Почему отключение разрешенного метода публикации csrf?
@Ezzat Eissa - Отключение csrf, безусловно, работает. Но это также делает наши API уязвимыми, не так ли? Если да, то как убедиться, что токен csrf настроен как на стороне сервера, так и на стороне клиента?
Основываясь на принятом ответе
Многие клиентские библиотеки HTTP (например, Axios) неявно устанавливают заголовок Content-Type: JSON для запросов POST. В моем случае я забыл разрешить этот заголовок, вызывая сбой только POSTS.
@Bean
CorsConfigurationSource corsConfigurationSource() {
...
configuration.addAllowedHeader("Content-Type"); // <- ALLOW THIS HEADER
...
}
Вы отправляете заголовок с почтальоном? Я думаю, что вы отправляете токен для аутентификации запроса. Вы отправляете этот токен по почте со своего мобильного устройства?