我正在尝试在Spring Boot应用程序中启用CORS,但它根本无法正常工作。
我尝试过
@CrossOrigin
注释目前我不知道如何解决此问题,也不知道CORS不能解决的问题。
我的代码
控制器
@RestController
public class DbController {
@Autowired
private IDAO conn;
@CrossOrigin
@GetMapping("/foo")
public List<Foo> getFoo() {
return conn.getFooFromDao();
}
}
DAO
@Repository
public class DaoImpl implements IDAO {
@Autowired
private JdbcTemplate temp;
public List<Foo> getFooFromDao() {
List<Foo> data = new ArrayList<>();
String sql = "SELECT fooName FROM BigFoo ORDER BY fooName ASC;";
data.addAll(temp.query(sql, new BeanPropertyRowMapper(BigFoo.class)));
return data;
}
}
预期:
我希望可以使用 any 方法从 any 来源/域访问控制器。
实际:
我的控制器无法从任何来源/域访问。它给我的Angular前端一个错误:
编辑:我在前端出现的错误
从源访问“ localhost:8080 / foo”处的XMLHttpRequest “ http://localhost:4200”已被CORS政策禁止:跨来源 仅协议方案支持请求:http,data,chrome, chrome-extension,https。
第二次修改:
这是我在Angular(前端)中的代码:
服务
getFoo() {
return this.http.get("localhost:8080/foo");
}
我正在使用HttpClient
中的import { HttpClient } from "@angular/common/http";
我还通过将URL复制并粘贴到我的浏览器中来验证URL是否可以使用该服务方法。确实确实会返回JSON,从而忽略了错误的URL或错字的可能性。
答案 0 :(得分:0)
您需要为注释@CrossOrigin(origins = "*")
添加原点
答案 1 :(得分:0)
将交叉原点放在控制器级别本身上
@RestController
@CrossOrigin(origins = "*")
public class DbController {
@Autowired
private IDAO conn;
@GetMapping("/foo")
public List<Foo> getFoo() {
return conn.getFooFromDao();
}
}
这是spring建议的直接解决方案,您也可以定义一个过滤器,以允许所有响应
@Component
public class SimpleCORSFilter implements Filter {
private final Logger log = LoggerFactory.getLogger(SimpleCORSFilter.class);
public SimpleCORSFilter() {
log.info("SimpleCORSFilter init");
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me");
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig filterConfig) {}
@Override
public void destroy() {}
}
此外,您还需要了解代码快照,没有提到协议http或https,还没有发送get请求,当您开始这样的订阅时,请求将被发送
getFoo() {
return this.http.get("http://localhost:8080/foo");
}
getFoo().subscribe(resp -> { // your logic });
// or directly inside getFoo() like this
getFoo() {
return this.http.get("http://localhost:8080/foo")
.subscribe(resp -> { // your logic });
}