Ошибка 404 при попытке опубликовать или получить RestController, когда веб-сервис и клиент находятся на другом порту

#angular #spring-boot

#angular #весенняя загрузка

Вопрос:

Я использую Spring-boot и Angular 2; Интерфейс и серверная часть работают на разных портах. Когда я проверяю URL с Advanced REST Client помощью (подключаемого модуля Google Chrome), я получаю 404 http://localhost:4000/user/register , и когда я ввожу информацию во внешнем интерфейсе, ничего не происходит.

Конфигурация веб-службы:

 @Configuration
public class CorsConfig {

    @Component
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public class CorsFilter implements Filter {

        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
            HttpServletResponse response = (HttpServletResponse) res;
            HttpServletRequest request = (HttpServletRequest)req;
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
            response.setHeader("Access-Control-Allow-Headers", "origin, x-requested-with, accept, Authorization, Content-Type");
            response.setHeader("Access-Control-Max-Age", "3600");
            if (!request.getMethod().equals("OPTIONS")) {
                try {
                    chain.doFilter(req, res);
                } catch (IOException e) {
                    System.out.println("IO Exception in CorsFilter: " e);
                    e.printStackTrace();
                } catch (ServletException e) {
                    System.out.println("Servlet Exception is CorFilter " e);
                    e.printStackTrace();
                }
            }
        }

        public void init(FilterConfig filterConfig) {}

        public void destroy() {}

    }

}
  

Выше показано, как я настроил серверную часть.

Я пытаюсь зарегистрировать новый user (Angular 2)

 @Injectable()
export class RegisterService {

    constructor (private http:Http) { }

    sendUser (newUser: RegisterModel) {
        let url = "http://localhost:4000/user/register";
        let header = new Headers({'Content-Type': 'application/json'});

        return this.http.post(url, JSON.stringify(newUser),{headers: header});
    }
}
  

И это компонент:

 @Component ({
    moduleId: module.id,
    selector: 'register',
    templateUrl: './register.html'
})
export class RegisterComponent {

    newUser: RegisterModel = new RegisterModel();

    constructor (private registerService: RegisterService){

    }

    onSubmit() {
        this.registerService.sendUser(this.newUser).subscribe(
            data => {
                this.newUser = new RegisterModel();
                console.log("New user was created.")
            },
            error => console.log(error)
        );
    }
}
  

Restfull service

 @RestController("/user")
public class UserController {

    @Autowired
    UserService userService;


    @RequestMapping(value = "/register", method = RequestMethod.POST)
    public User registerUser(@RequestBody User user){

        System.out.println("YAY-----------" user.getFirstName());
        return userService.save(user);
    }



}
  

Ничего не выводится и ошибка не выдается.

В моем application.properties у меня есть

server.port=4000

Страницы отображаются, но, похоже, серверная часть не отвечает.

Я также опубликовал его в GIT, если кто-нибудь захочет посмотреть.

Ссылка на концентратор Git

———————Обновление 1———————

Я обновил свой SecurityConfig до:

 @Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/").permitAll()
            .anyRequest().authenticated().and()
            .formLogin().loginPage("/").permitAll().and()
            .logout().permitAll();

        http.authorizeRequests().antMatchers("/user/register")
            .permitAll().anyRequest().anonymous();

        http.authorizeRequests().antMatchers("/")
            .permitAll().anyRequest().authenticated();

        http.formLogin().loginPage("/")
            .permitAll().and().logout().permitAll();

    }

}
  

2) Я также удалил pom file в frontend каталоге.

Результат: теперь я получаю The requested URL can't be reached , когда использую Advanced REST client (подключаемый модуль Google Chrome).

Обновил его в GIT.

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

1. родительский pom вашего проекта на github содержит ошибки. (1) тип должен быть «pom», а не «war». (2) строка 56 содержит текст мусора «rc.6», который делает xml недействительным. модульный тест завершается с ошибкой во время компиляции (RequestDemoApplicationTests.java )

2. ваш проект angular / npm ТАКЖЕ наследует spring boot и определяет spring-boot-plugin ( тот, что в бэкэнд-проекте), который заставляет spring boot искать 2 основных класса и выдает это во время сборки: «Невозможно найти основной класс». Решение: ваш интерфейсный проект — это проект javascript, почему у него есть pom с зависимостями от spring-boot?

3. В pom вашего проекта нужно многое исправить, прежде чем даже переходить к вашей ошибке. Конечно, вы не создавали свой проект с помощью maven, и вы только создаете / запускаете его из intellij?

4. ваш application.properties (на github) НЕ содержит server.port = 4000

5. Я исправил все проблемы, чтобы он создавался. Затем я смог запустить его («mvn spring-boot: run» «запуск npm»). Я опубликовал ответ на вашу проблему.

Ответ №1:

Перенаправление конфигурации безопасности на root => Ошибка 404

Я предполагаю, что вы отправляете register запрос до проверки подлинности? Ваша конфигурация безопасности перенаправляет все запросы на / , которые не обслуживаются на серверной стороне. Таким образом, он не найден, и вы получаете 404 .

Ваша конфигурация безопасности

Это ваша WebSecurityConfigurerAdapter конфигурация безопасности:

 http.authorizeRequests().antMatchers("/").permitAll()
    .anyRequest().authenticated().and()
    .formLogin().loginPage("/").permitAll().and()
    .logout().permitAll();
  

Разрешить анонимному отправлять register запрос

Вы можете изменить конфигурацию безопасности на это, чтобы пропустить register проверку подлинности:

 http.authorizeRequests().antMatchers("/user/register")
    .permitAll().anyRequest().anonymous();

http.authorizeRequests().antMatchers("/")
   .permitAll().anyRequest().authenticated();

http.formLogin().loginPage("/")
    .permitAll().and().logout().permitAll();
  

В принципе, разрешить anonymous отправлять запрос register.

Другие ошибки в вашем проекте (также выделены в comments разделе)

  • родительский pom должен иметь тип ‘pom’
  • строка 56 родительского pom содержит ошибку
  • ваш интерфейс pom не должен включать spring-boot (что приводит к тому, что spring boot ищет 2 основных класса и завершается неудачей)

Обновление после комментариев

(1) UserController

В вашем UserController не определено никакого сопоставления. Вы ошибочно использовали @RestController("/user") , но это должно быть:

 @RestController
@RequestMapping("/user")
public class UserController {
  

(2) SecurityConfig

У вас все еще осталось от вашей предыдущей конфигурации в SecurityConfig:

 protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().antMatchers("/").permitAll()
        .anyRequest().authenticated().and()
        .formLogin().loginPage("/").permitAll().and()
        .logout().permitAll();

    http.authorizeRequests().antMatchers("/user/register")
        .permitAll().anyRequest().anonymous();

    http.authorizeRequests().antMatchers("/")
        .permitAll().anyRequest().authenticated();

    http.formLogin().loginPage("/")
        .permitAll().and().logout().permitAll();    
}
  

измените его на:

 protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();

    http.authorizeRequests().antMatchers("/user/register")
        .permitAll().anyRequest().anonymous();

    http.authorizeRequests().antMatchers("/")
        .permitAll().anyRequest().authenticated();

    http.formLogin().loginPage("/")
        .permitAll().and().logout().permitAll();
}
  

Первая строка отключает csrf (подделка межсайтового запроса). Теперь я недостаточно осведомлен в этом вопросе, чтобы дать вам объяснение, но если вы не отключите его, вы получите 403 запрещенных ответа. Я предлагаю вам отключить его и вернуться к этому позже, когда ваша текущая проблема будет устранена.


Вот и все, ваш серверный сервер получит и ответит на запрос /user / register (и я вижу журнал интерфейса в консоли: «Создан новый пользователь».

РЕДАКТИРОВАТЬ 18 октября

Я клонировал ваш проект, и он работал. Вот точные шаги, которые я сделал:

  • Открыл терминал и набрал git clone https://github.com/drewjocham/AngularIssue.git
  • Исправлен пакет RequestDemoApplicationTests от test.java.com.request to com.request
  • Открыл терминал в AngularIssuebackend
  • Набран mvn clean install
  • Типизированный mvn spring-boot:run (серверная часть теперь запущена)
  • Открыл другой терминал в AngularIssuefrontend
  • Набран npm install
  • Типизированный npm start (теперь запускается интерфейс)
  • Открыт http://localhost:3000 в Chrome
  • Открыл inspect->console представление в Chrome
  • Заполнил регистрационную форму и нажал отправить
  • Консоль Chrome показывает New user was created.
  • Серверный терминал показывает YAY-----------a

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

1. Большое вам спасибо за ваши усилия! 1) Я внес вышеуказанные изменения, и это привело к The requested URL can't be reached. использованию клиента Google REST… 2) Я удалил файл pom в интерфейсе. 3) На данный момент я запускаю проект в intellij через встроенный tomcat. 4) Не уверен, почему applications.properties не обновлялся, когда я вносил изменения и размышлял над git. 5) Спасибо за совет, и я обновляю свой проект на git.

2. Не могли бы вы обновить свой вопрос своей ошибкой? Где вы видите «Запрошенный URL-адрес недоступен». ошибка? Какой URL-адрес вызывает эту ошибку? Что вы видите в своем браузере в представлении «проверка»? Вы видите журнал «Yay» в вашем контроллере загрузки spring?

3. Теперь я обновляю вопрос, и я вижу ошибку с расширенным клиентом REST (подключаемый модуль Google с помощью Google Chrome). Я ничего не вижу в консоли в моей IDE.

4. Обновление завершено. Большое вам спасибо за помощь, это действительно ценится!

5. Обновлен ответ — см. Вторую часть ответа «обновление после комментариев»