Ioni c / Angular HTTP-запросам приложения не удается подключиться к Spring REST API с использованием устройства Android emulator / real Android при настройке IP-адреса узла - PullRequest
0 голосов
/ 13 февраля 2020

Мне не удается выполнить http-запросы из моего приложения Ioni c к моему Spring API, когда я нацеливаюсь на фактический адрес хоста (192.168 ...). Использование localhost в моем браузере Chrome работает нормально, также как и использование шлюза эмулятора Android (10.0.2.2) в моем виртуальном устройстве. Однако, как только я использую свой хост-ip, только браузер Chrome может отправлять запросы. Я также позаботился о том, чтобы мое реальное устройство находилось в той же сети, что и мой хост, и оно действительно могло обращаться к Spring API через свой браузер. К сожалению, если я затем пытаюсь отправить http-запрос в приложении, я получаю действительно пустое сообщение об ошибке:

{
   "headers":{
      "normalizedNames":{},
      "lazyUpdate":null,
      "headers":{}
   },
   "status":0,
   "statusText":"Unknown Error",
   "url":"http://hostip:8080/authentication",
   "ok":false,
   "name":"HttpErrorResponse",
   "message":"Http failure response for http://hostip:8080/authentication: 0 Unknown Error",
   "error":{
      "isTrusted":true
   }
}

Вот как выглядит мой метод входа в систему:

  login(email: string, password: string) {

    const httpOptions = {
      headers: new HttpHeaders({
        'Authorization': 'Basic ' + base64string
      }),
      observe: 'response' as 'body',
      withCredentials: true
    };
    return this.http.get(
      'http://hostip:8080/authentication', httpOptions
    );
  }

В любой другой момент моего приложения я просто вызываю метод http.get с URL-адресом и withCredentials: true в качестве аргумента. Я также убедился, что эти строки включены в мою конфигурацию. xml:

<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />

Я также добавил CORS-фильтр в мой Spring API, так как я отправляю заголовок авторизации и хочу установить Access-Control-Allow-Origin: * но объединение этих двух вещей запрещено CORS-политикой, поэтому мой фильтр берет источник запроса и возвращает его в Access-Control-Allow-Origin-Header. Поэтому любое происхождение разрешено без использования подстановочного знака *.

@Component
public class SimpleCORSFilter implements Filter {

    public SimpleCORSFilter() {}

    @Override
    public void init(FilterConfig filterConfig) {}

    @Override
    public void destroy() {}

    @Order(Ordered.HIGHEST_PRECEDENCE)
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        System.out.println("Origin: " + request.getHeader("Origin"));

        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "X-Requested-With, Authorization, Origin, Content-Type, Version");
        response.setHeader("Access-Control-Expose-Headers", "X-Requested-With, Authorization, Origin, Content-Type");

        chain.doFilter(req, res);
    }
}

My Spring Security Config очень прост:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
            .csrf().disable()
            .authorizeRequests()
            .antMatchers(HttpMethod.OPTIONS).permitAll()
            .antMatchers(HttpMethod.GET).permitAll()
            .antMatchers("/logout").permitAll()
            .anyRequest().hasAnyRole("USER")
        .and()
            .httpBasic()
        .and()
            .logout();
    }
} 

Я действительно ценю всю помощь, которую могу получить, и я с нетерпением жду ваших ответов.

1 Ответ

0 голосов
/ 13 февраля 2020

Android изменил свою архитектуру http с версии 9.

, чтобы она работала на Android go в папке вашего проекта root.

yourAppFolder> ресурсы> android> xml> network_security_config. xml

Измените конфигурацию безопасности вашей сети на код удара.

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...