Angular 2 中的授权 header 使用服务 JAX-RS
Authorization header in Angular 2 using service JAX-RS
我正在使用 angular 5 作为 front-end 和 java 以及球衣作为 back-end 制作 um 应用程序。当我尝试从我的 front-end angular 消费时,我遇到了身份验证问题。这是客户端应用程序的代码 angular:
const headers = {
'Content-Type': 'application/json',
'Authorization': this.auth.token
};
return this.http.get(this.url, { headers: headers, withCredentials: true })
.toPromise()
.then(this.extractData)
.catch(this.handleErrorPromise);
但是在寻找生成的请求时,我在我的服务器中找不到 header 'authorization'。我只收到:
host:100.0.66.160:8092
connection:keep-alive
pragma:no-cache
cache-control:no-cache
access-control-request-method:GET
origin:http://localhost:4200
user-agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
access-control-request-headers:authorization,content-type
accept:*/*
accept-encoding:gzip, deflate
accept-language:pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7
然后我没有找到"authorization"进行验证,有人可以告诉我那里有什么问题吗?
遵循server-side中的验证码:
String authorizationHeader = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION);
Autenticador autenticacao = new Autenticador();
String token;
extrairHeader(requestContext);
if (authorizationHeader != null && authorizationHeader.contains("Bearer ")) {
token = authorizationHeader.substring("Bearer ".length()).trim();
Key key = new KeyGenerator().generateKey();
return autenticacao.tokenValido(token, key);
} else {
return false;
}
这不是实际请求,而是 CORS Preflight。您可以判断是因为请求中包含以下 headers:
origin
access-control-request-method
access-control-request-headers
这些headers正在询问服务器是否允许请求。服务器应该相应地响应 headers 以告诉浏览器允许该请求。如果预检没问题,那么真正的请求就发出了。
有关完整说明以及如何使用 JAX-RS 过滤器解决此问题,请查看 this post。
我不知道这个更好的解决方案,但它是这样工作的:
我在服务器端创建了一个新的 class 来验证请求:
@Provider
@Priority(Priorities.HEADER_DECORATOR)
@WebFilter(filterName = "AddHeaderFilter", urlPatterns = {"/*"})
public class CORSFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
resp.addHeader("Access-Control-Allow-Origin", "*");
resp.addHeader("Access-Control-Allow-Methods", "GET,POST");
resp.addHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
// Just ACCEPT and REPLY OK if OPTIONS
if (request.getMethod().equals("OPTIONS")) {
resp.setStatus(HttpServletResponse.SC_OK);
return;
}
chain.doFilter(request, servletResponse);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
这种方法行得通。
我正在使用 angular 5 作为 front-end 和 java 以及球衣作为 back-end 制作 um 应用程序。当我尝试从我的 front-end angular 消费时,我遇到了身份验证问题。这是客户端应用程序的代码 angular:
const headers = {
'Content-Type': 'application/json',
'Authorization': this.auth.token
};
return this.http.get(this.url, { headers: headers, withCredentials: true })
.toPromise()
.then(this.extractData)
.catch(this.handleErrorPromise);
但是在寻找生成的请求时,我在我的服务器中找不到 header 'authorization'。我只收到:
host:100.0.66.160:8092
connection:keep-alive
pragma:no-cache
cache-control:no-cache
access-control-request-method:GET
origin:http://localhost:4200
user-agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
access-control-request-headers:authorization,content-type
accept:*/*
accept-encoding:gzip, deflate
accept-language:pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7
然后我没有找到"authorization"进行验证,有人可以告诉我那里有什么问题吗?
遵循server-side中的验证码:
String authorizationHeader = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION);
Autenticador autenticacao = new Autenticador();
String token;
extrairHeader(requestContext);
if (authorizationHeader != null && authorizationHeader.contains("Bearer ")) {
token = authorizationHeader.substring("Bearer ".length()).trim();
Key key = new KeyGenerator().generateKey();
return autenticacao.tokenValido(token, key);
} else {
return false;
}
这不是实际请求,而是 CORS Preflight。您可以判断是因为请求中包含以下 headers:
origin
access-control-request-method
access-control-request-headers
这些headers正在询问服务器是否允许请求。服务器应该相应地响应 headers 以告诉浏览器允许该请求。如果预检没问题,那么真正的请求就发出了。
有关完整说明以及如何使用 JAX-RS 过滤器解决此问题,请查看 this post。
我不知道这个更好的解决方案,但它是这样工作的:
我在服务器端创建了一个新的 class 来验证请求:
@Provider
@Priority(Priorities.HEADER_DECORATOR)
@WebFilter(filterName = "AddHeaderFilter", urlPatterns = {"/*"})
public class CORSFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
resp.addHeader("Access-Control-Allow-Origin", "*");
resp.addHeader("Access-Control-Allow-Methods", "GET,POST");
resp.addHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
// Just ACCEPT and REPLY OK if OPTIONS
if (request.getMethod().equals("OPTIONS")) {
resp.setStatus(HttpServletResponse.SC_OK);
return;
}
chain.doFilter(request, servletResponse);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
这种方法行得通。