#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, если кто-нибудь захочет посмотреть.
———————Обновление 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
tocom.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. Обновлен ответ — см. Вторую часть ответа «обновление после комментариев»