【问题标题】:Spring API consumed by Webapp and mobile appWebapp 和移动应用程序使用的 Spring API
【发布时间】:2018-02-08 01:21:46
【问题描述】:

我有一个使用 Angular 2 开发的 web 应用程序和一个使用 Springboot 开发的 Rest API。

Mme Michu ---> WebApp (Angular 2 - Known origin) ---> API (Springboot CORS)

我在 webapp 和 API 之间配置了 CORS,它工作正常。

这是我的 CORSFilter 的实现方式

@Order(Ordered.HIGHEST_PRECEDENCE)
public class SimpleCORSFilter implements Filter{

public SimpleCORSFilter () {
    super();
}

@Autowired
private Environment environment;

private String[] acao;

@Override
public final void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws IOException, ServletException {

    acao = environment.getProperty("access-control-allow-origin").split(",");

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

    String origin = request.getHeader("Origin");

    response.setHeader("Access-Control-Allow-Origin", Arrays.asList(acao).contains(origin)?origin:"" );

    // without this header jquery.ajax calls returns 401 even after successful login and SSESSIONID being succesfully stored.
    response.setHeader("Access-Control-Allow-Credentials", "true");

    response.setHeader("Access-Control-Allow-Methods", "POST, PUT, 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");


    if(!request.getMethod().equals("OPTIONS")) {
        chain.doFilter(request, response);
    }
}

@Override
public void destroy() {

}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
    acao = environment.getProperty("access-control-allow-origin").split(",");
}

}

问题是我需要一个新的移动应用程序(使用 ionic 开发)来与 API 交互。

Mme Michu --> MobileApp (Unknown origin) ---> API (Springboot CORS)

CORS 政策会阻止来自移动应用的请求吗? 由于我不知道移动应用程序的“来源”,如何授权来自移动应用程序的请求?

欢迎任何建议......

【问题讨论】:

    标签: spring-boot mobile ionic-framework spring-security cors


    【解决方案1】:

    origin 是向 api 发出请求的域,如果您的 webapp 的域是 example.com,则请求将以 example.com 作为源。当资源由于来源而被阻止时,是客户端安全机制阻止了响应(服务器不知道它)。你不知道 Ionic 是如何工作的,但我不认为它实现了这种机制(可能除了渐进式 Web 应用程序)。

    服务器负责报告允许的来源。 Web 浏览器负责强制仅从允许的域发送请求。

    【讨论】:

    • 我不明白你的答案... CORS 过滤器是服务器端的,所以客户端(移动应用程序)如何提供授权的来源?
    • CORS 标头是由您的服务器发送的,没错,但是当源与服务器不匹配时,阻塞的不是服务器。使用不同的来源进行测试,您将看到服务器正在发送被客户端(您的浏览器)阻止的响应。服务器负责报告允许的来源。 Web 浏览器负责强制只从允许的域发送请求。
    • 超级!我试试看!谢谢;)
    猜你喜欢
    • 1970-01-01
    • 2014-07-22
    • 2020-04-19
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2011-06-02
    • 2014-02-25
    • 1970-01-01
    相关资源
    最近更新 更多