Ошибка CORS при перенаправлении страницы angular из spring boot: тип содержимого поля заголовка не разрешен Access-Control-Allow-Headers в предполетном режиме

#java #spring-boot #cors #preflight

#java #spring-boot #cors #предварительный запуск

Вопрос:

Я разрабатываю приложение с angular 6 в качестве интерфейса и spring boot в качестве серверной части. В настоящее время я работаю с функцией «забыл пароль» :

  1. Получение идентификатора электронной почты из angular и отправка электронного письма на идентификатор.
 @RequestMapping(value = "/forgotPassword", method = RequestMethod.POST)
public ResponseEntity<?> forgotPassword(@RequestParam("email") String recepientemail, HttpServletRequest request) {
    Optional<User> userlist = userRepository.findByEmail(recepientemail);
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    if (userlist.isPresent()) {
        User u = userlist.get();
        u.setResetToken(UUID.randomUUID().toString());       
           u.setResetTokenExpiry(simpleDateFormat.format(DateUtils.addDays(new Date(), 1)));
            u.setModifiedBy(u.getId());
            u.setModifiedDate(simpleDateFormat.format(new Date()));
            userRepository.save(u);
            String appUrl = request.getScheme()   "://"   request.getServerName()   ":"   request.getLocalPort();

            // Email message
            email.sendSimpleEmail(u.getEmail(), "DIS Password Reset Request",
                    "To reset your password, click the link below:n"   appUrl   "/dis/resetPassword?resetToken="
                              u.getResetToken());
            return new ResponseEntity<>(
                    new ResponseMessage("A password reset link has been sent to registered email address!"),
                    HttpStatus.OK);
        }
        return new ResponseEntity<>(new ResponseMessage("We didn't find an account for this e-mail address!"),
                HttpStatus.BAD_REQUEST);
    }
  
  1. При нажатии на ссылку spring boot перенаправит на страницу сброса пароля angular.
 @RequestMapping(value = "/resetPassword", method = RequestMethod.GET)
    public ModelAndView displayResetPasswordPage(@RequestParam("resetToken") String token) throws ParseException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Optional<User> user = userRepository.findUserByResetToken(token);
        ModelAndView modelAndView = new ModelAndView();
        if (user.isPresent()) { // Token found in DB
            if (simpleDateFormat.parse(user.get().getResetTokenExpiry()).after(new Date())) {
                modelAndView.addObject("resetToken", token);
                modelAndView.setViewName("redirect:http://localhost:4200/reset-password");
            } else {
                modelAndView.addObject("errorMessage", "Oops!  Your password reset link has expired.");
                modelAndView.setViewName("redirect:http://localhost:4200/forgot-password");
            }
        } else { // Token not found in DB
            modelAndView.addObject("errorMessage", "Oops!  This is an invalid password reset link.");
            modelAndView.setViewName("redirect:http://localhost:4200/forgot-password");
        }
        return modelAndView;
    }
  
  1. Введя новый пароль на странице сброса, angular передаст токен сброса и новый пароль spring boot, а затем spring boot должен перенаправить на страницу входа в систему после успешной смены пароля.
 @RequestMapping(value = "/processResetPassword", method = RequestMethod.POST)
    public ModelAndView setNewPassword(@RequestBody Map<String, String> requestParams, RedirectAttributes redir, HttpServletResponse response) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Optional<User> user = userRepository.findUserByResetToken(requestParams.get("resetToken"));
        ModelAndView modelAndView = new ModelAndView();
        if (user.isPresent()) {
            User resetUser = user.get();
            resetUser.setPassword(encoder.encode(requestParams.get("password")));
            resetUser.setResetToken(null);
            resetUser.setResetTokenExpiry(null);
            resetUser.setModifiedBy(resetUser.getId());
            resetUser.setModifiedDate(simpleDateFormat.format(new Date()));
            userRepository.save(resetUser);
            //redir.addFlashAttribute("successMessage", "You have successfully reset your password. You may now login.");
            //modelAndView.addObject("successMessage", "You have successfully reset your password. You may now login.");
           modelAndView.setViewName("redirect:http://localhost:4200");
            return modelAndView;
        } else {
            modelAndView.addObject("errorMessage", "Oops!  This is an invalid password reset link.");
            modelAndView.setViewName("redirect:http://localhost:4200/forgot-password");
        }
        return modelAndView;
    }
  

Теперь проблема в том, что во втором пункте spring boot может отлично перенаправлять страницу сброса пароля, но в третьем пункте при перенаправлении на страницу входа в систему выдает ошибку CORS. Почему?

Вот скриншот ошибки скриншот

Редактировать: Вот аннотация с перекрестным происхождением

 @CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequestMapping("/dis")
public class AuthRestAPIs {....}
  

и вот заголовок запроса в сети заголовок запроса

Комментарии:

1. Я нигде не вижу @CrossOrigin аннотации, и вы не показали HTTP-заголовки из своих сетевых запросов. На заметку, прохождение мимо HttpServletRequest почти всегда является признаком того, что вы доставляете себе больше хлопот, чем необходимо. В этом случае UriComponentsBuilder вместо этого передайте; вы можете использовать MvcUriComponentsBuilder.relativeTo для создания нужной вам ссылки гораздо более чистым способом.

2. @chrylis, привет, я обновил свой вопрос с помощью @CrossOrigin заголовка запроса, пожалуйста, взгляните, а также, я передаю HttpServletRequest в forgotPassword метод, и это работает нормально. Более того, в setNewPassword методе else часть работает нормально, она отлично перенаправляет на страницу с забытым паролем, поэтому я не понимаю, в чем проблема с частью if в том же, почему она предоставляет null в источнике заголовка запроса

3. Ваша конфигурация CORS должна быть обновлена, чтобы сервер отправил обратно заголовок ответа Access-Control-Allow-Headers, который включает ‘Content-Type’ в его значение.