Angular 2中的授权标头使用服务JAX-RS

时间:2018-05-28 19:45:16

标签: java angular authentication oauth jax-rs

我正在使用angular 5作为前端而java使用jersey作为后端。当我尝试从前端角度消耗时,我的身份验证有问题。这是客户端应用程序角度代码:

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);

但是查找生成的请求我找不到标题'授权'在我的服务器中。我只收到:

  

主机:100.0.66.160:8092
  连接:保持活动
  附注:无缓存
  缓存控制:无缓存
  访问控制请求-方法:GET
  起源:http://localhost:4200
  user-agent:Mozilla / 5.0(Windows NT 6.1; Win64; x64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 66.0.3359.181 Safari / 537.36
  访问控制请求报头:授权,内容类型
  接受:* / *
  accept-encoding:gzip,deflate
  接受语言:PT-BR,PT; Q = 0.9,的en-US; Q = 0.8,连接; Q = 0.7

然后我找不到"授权"为了验证,有人可以说我有什么问题吗?

遵循服务器端的验证码:

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;
    }

2 个答案:

答案 0 :(得分:1)

这不是实际请求,而是CORS Preflight。您可以告诉我,因为请求中包含以下标头:

  • origin
  • access-control-request-method
  • access-control-request-headers

这些标头询问服务器是否允许请求。服务器应该相应地响应响应头以告诉浏览器该请求是允许的。如果预检是好的,那么就会发出真实的请求。

如需完整说明以及如何使用JAX-RS过滤器解决此问题,请查看this post

答案 1 :(得分:1)

如果这个更好的解决方案,我不会这样做,但是这样工作:

我在服务器端创建了一个新类来验证请求:

@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 {
}

}

这种方式有效。