我目前正在尝试解决我们在使用从 Angular 调用的 FN 项目函数查询数据库时遇到的 CORS 问题。fnproject/fn-java-fdk:1.0.83
FN函数是用 Java(数据库。数据库以查询结果进行响应,查询结果通过 FN 函数以适当的响应传递回 UI。
我尝试将 CORS 标头作为 htxc.setResponseHeader() 和 htxc.addResponseHeader()。我还尝试更改 func.yaml 以在其中包含 CORS 协议,而不是在函数内部,但这不起作用。此外,我尝试将"*"
标Access-Control-Allow-Origin
头中的 更改为我们也从中发出请求的特定 URL。我们还考虑添加许多不同的标头,Access-Control-Allow-Headers
希望其中一个可以解决问题。
import com.fnproject.fn.api.httpgateway.HTTPGatewayContext;
...
public class query_database {
/**
* @param input is a byte[] array with input, contains the request information
* @return List<dbObject> A list of DB Objects
*/
public List<dbObject> query(byte[] input, HTTPGatewayContext htxc){
// Takes care of the HTTP Gateway context
htxc.setResponseHeader("Access-Control-Allow-Origin", "*");
htxc.addResponseHeader("Access-Control-Allow-Methods", "POST, GET");
htxc.addResponseHeader("Access-Control-Allow-Headers", "Authorization, Origin, X-Requested-With, Content-Type, Accept, Content-Length, X-Experience-API-Version, X-Prototype-Version, Token, X-Auth-Token");
htxc.addResponseHeader("Access-Control-Allow-Credentials", "true");
if (htxc.getMethod().equals("OPTIONS")) {
return Collections.emptyList();
}
String str = new String(input);
JSONObject json = new JSONObject(str);;
Request request = new Request();
String system = json.getString("system");
request.setSystem(system);
queryFunc queryFunc = new queryFunc();
try {
return queryFunc.makeQuery(request);
} catch(DBConnection | HttpException |IOException | emptyStringException e) {
return Collections.emptyList();
}
}
}
在我们正在制作的 Angular 7 UI 中,当我们在 Chrome/Firefox 中打开它时会出现以下错误:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://server.com:8080/t/function/function-trigger. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing). (unknown)
尽管在 Java 代码中设置了“Access-Control-Allow-Origin”响应标头,但仍然如此。除此 CORS 错误外,该函数正常工作,因此我们相当确信它与标头有关。例如,JSON 响应是正确的。
有什么想法吗?当前的标头方法可能存在问题,或者它也可能在 Angular 方面。让我知道是否还需要澄清这个问题。