Мне не удается выполнить 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();
}
}
Я действительно ценю всю помощь, которую могу получить, и я с нетерпением жду ваших ответов.