предисловие
Есть проект кошелька, в котором изначально использовался набор микросервисов, позже я счел его ненужным и переделал в простой springboot проект, но после рефакторинга проверки токена возникла проблема, перед написанием фильтра использовал springgateway , который основан на GatewayFilter.Реализация, основанная на фильтре после рефакторинга, а затем при попадании запроса в фильтр обнаруживается, что не удается получить пользовательский заголовок запроса.
String token = request.getHeader("token"); // null
String id = request.getHeader("id"); // null
String role = request.getHeader("role"); // null
причина
Я проверил servletRequest, когда вошел в точку останова, и обнаружил, что метод запроса — это параметры. Я знаю, получить сообщение удалить поставить. Я действительно не разбираюсь в вариантах, поэтому Baidu посмотрел.В основном ссылайтесь на эту статью. Оказалось, что это проблема политики одного и того же происхождения браузера, то есть cors, но, если подумать, я настроил cors.
@Configuration
public class CorsConfig {
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*"); // 1
corsConfiguration.addAllowedHeader("*"); // 2
corsConfiguration.addAllowedMethod("*"); // 3
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig()); // 4
return new CorsFilter(source);
}
}
Почему я все еще сообщаю о междоменной проблеме?Я вспомнил, что, поскольку я не мог получить токен заголовка запроса в своем tokenFilter, я выдал исключение параметра, а затем @RestControllerAdvice и @ExceptionHandle не смогли обработать исключение, выброшенное в фильтре, в результате чего программа сообщает об ошибке 500, а затем фильтр аналогичен аспекту, здесь он сломан, и заголовок возврата не добавляется.
иметь дело с
Как быть с запросом опций препроцессинга, отправленным браузером, это слишком лениво, поэтому я написал это так
HttpServletRequest request= (HttpServletRequest)servletRequest;
HttpServletResponse res = (HttpServletResponse) servletResponse;
String method=request.getMethod();
if(HttpMethod.OPTIONS.toString().equals(method)){
res.setStatus(HttpStatus.NO_CONTENT.value());
}else {
String token = request.getHeader("token");
String id = request.getHeader("id");
String role = request.getHeader("role");
~~~~~~~
отзывать
Я помню, что не обрабатывал запрос опций в своем последнем проекте, почему я не сообщил о проблеме с cors, кстати, я помню, что обрабатывал это в nginx.
if ($request_method = 'OPTIONS') {
return 204;
}
add_header Access-Control-Allow-Origin * always;
add_header Access-Control-Allow-Headers "Content-Type, Authorization" always;
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, PATCH, DELETE, HEAD" always;
add_header Access-Control-Max-Age 86400 always;
Получается, что я написал и фронтенд и бэкенд, как мне еще столкнуться с этими проблемами?😌, их написали старшие, а я пока не сталкивался с проблемами, и не углублялся в них, и почему corsWebFilter в springcloud похож на springboot?Внутренний corsFilter отличается.
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}
Мне все еще нужно посмотреть исходный код, я crudboy