我试图在Spring Boot应用程序中启用CORS支持,但没有成功。我研究了很多解决方案,但似乎都不适合我。
当我尝试从Angular应用程序呼叫Java后端时,我在chrome中看到了错误:
CORS策略阻止从源http://localhost:4200在http://localhost:8080/..处访问XMLHttpRequest:对预检请求的响应不通过权限改造检查:不允许对预检请求进行重定向。
我已经通过添加以下注释在控制器方法级别启用了CORS,但我仍然得到预飞行请求错误。
@CrossOrigin(origins = "http://localhost:4200")
我的Spring Security配置:
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/**");
}
}
我的自定义过滤器:
@Configuration
public class AuthFilter implements Filter {
@Autowired
private Environment env;
private static final ApplicationLogger logger = ApplicationLogger.getInstance();
@Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.debug("Initializing authentication filter.");
}
public boolean checkHeader(HttpServletRequest httpRequest) {
boolean flag = false;
String applicationName = httpRequest.getHeader("bar");
if (applicationName != null && applicationName.equalsIgnoreCase("foo")) {
flag = true;
}
return flag;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
// HttpSession httpSession = httpRequest.getSession();
List<String> excludedUrls = null;
String excludePattern = env.getProperty("excludedUrls");
excludedUrls = Arrays.asList(excludePattern.split(","));
String path = ((HttpServletRequest) request).getServletPath();
String loginPathURL = env.getProperty("loginPathURL");
if (excludedUrls.contains(path)
|| path.contains("/file/..")
|| path.contains("/file/...")
|| path.contains("/file/....")) {
chain.doFilter(request, response);
} else if (checkHeader(httpRequest)) {
// Authenticate the request through LDAP
logger.info("Authenticating the request ...");
chain.doFilter(request, response);
} else {
logger.debug("User is not authenticated");
httpResponse.sendRedirect(loginPathURL);
}
/*
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpSession httpSession = httpRequest.getSession();
List<String> excludedUrls = null;
String excludePattern = env.getProperty("excludedUrls");
excludedUrls = Arrays.asList(excludePattern.split(","));
String path = ((HttpServletRequest) request).getServletPath();
if (excludedUrls.contains(path)) {
// Authenticate the request through LDAP
logger.info("Authenticating the request ...");
chain.doFilter(request, response);
}
else if(checkHeader(httpRequest)) {
else if (httpSession != null && httpSession.getAttribute(WorkpermitConstants.CLIENT_AUTH_TOKEN_KEY) != null) {
List<Map<String,Object>> res = (List<Map<String,Object>>) jdbcTemplate.queryForList("some select query") ;
if(!AppUtil.isObjectEmpty(res.size())) {
for (Map<String, Object> row : res) {
//currentUserEmail
//empType
//userId
//username
}
}
chain.doFilter(request, response);
} else {
logger.debug("User is not authenticated.");
HttpServletResponse httpResponse = (HttpServletResponse) response;
//httpResponse.sendRedirect(httpRequest.getContextPath() + "/");
httpResponse.sendRedirect("http://..");
}
*/
// comment below code
// chain.doFilter(request, response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
在研究了一些解决方案后,我在我的类中添加了以下代码,但它也不适合我。
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors();
}
@Bean
CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("http://localhost:4200"));
configuration.setAllowedMethods(Arrays.asList("GET","POST","OPTIONS"));
// NOTE: setAllowCredentials(true) is important,
// otherwise, the value of the 'Access-Control-Allow-Origin' header in the response
// must not be the wildcard '*' when the request's credentials mode is 'include'.
configuration.setAllowCredentials(true);
// NOTE: setAllowedHeaders is important!
// Without it, OPTIONS preflight request will fail with 403 Invalid CORS request
configuration.setAllowedHeaders(Arrays.asList(
"Authorization",
"Accept",
"Cache-Control",
"Content-Type",
"Origin",
"ajax",
"x-csrf-token",
"x-requested-with"
));
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
Spring启动版本:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
将@CrossOrigin
注释添加到以下任一项:
>
控制器方法级别-这仅限制/启用此特定方法的跨域资源共享。
@交叉原点(原点=”http://localhost:4200")
全球CORS
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:8080");
}
};
}
注意:在origin中共享完整的URL(带有http://)很重要
有关更多信息,请参阅:https://spring.io/guides/gs/rest-service-cors/
在main方法上添加@CrossOrigin("http://localhost:4200")
,如果您希望它用于特定的控制器,请在控制器上添加注释。
20.CORS 支持 20.1简介 出于安全考虑,浏览器禁止AJAX调用驻留在当前来源之外的资源。 例如,当您在一个标签中检查您的银行帐户时,您可以在另一个标签中打开evil.com网站。 evil.com的脚本不能使用您的凭据向您的银行API发出AJAX请求(例如,从您的帐户中提款)! Cross-origin resource sharing(CORS) 是大多数浏览器实现的W3C规范,允许您
问题内容: 我有一个使用restify模块创建的REST api,我想允许跨域资源共享。最好的方法是什么? 问题答案: 您必须将服务器设置为设置跨源标头。不知道是否有内置的使用功能,所以我写了自己的功能。 我是从本教程中找到的。http://backbonetutorials.com/nodejs-restify-mongodb- mongoose/
我正在尝试使用NetBeans(或任何IDE)开发JavaFX应用程序,但我无法正确安装JDK和JavaFX。 对于上下文,我使用Ubuntu 18.04 LTS,并遵循本指南。目前,当运行时,我得到以下输出: 这不是我想要使用的JDK。我已经从这个网站下载了JDK15,打开了tar。gz文件,并将其放入名为的文件夹中的。提取文件夹后,我将JDK添加到我的系统路径变量中: 然后是系统重启。在Net
我正在使用Jhipster来生成API。 在Spring boot中还需要做什么来启用CORS吗?
如CORS中所述,preflight请求由于标准头而失败,如果您将请求发送到endpoint,并设置了和头,那么它们将被Spring框架截获,并且您的方法不会得到执行。接受的解决方案是使用注释来阻止Spring返回。但是,我正在使用Swagger Codegen生成API代码,所以我只想禁用它,并手动实现我的响应。 那么你能在Spring禁用CORS拦截吗?