我使用Spring Rest作为我的后端,当我通过$ .ajax {}发送请求时,我收到了错误消息:
XMLHttpRequest无法加载http://121.40.249.129:8080/user/login。 No' Access-Control-Allow-Origin'标头出现在请求的资源上。起源' http://127.0.0.1:8000'因此不允许访问。
所以,我在Spring Project中添加了SimpleCORSFilter
:
SimpleCORSFilter:
@Component
public class SimpleCORSFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers", "X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version");
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig filterConfig) {}
@Override
public void destroy() {}
}
因为我没有web.xml,所以我没有将代码添加到web.xml:
<filter>
<filter-name>simpleCORSFilter</filter-name>
<filter-class>xxx.xxx.SimpleCORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>simpleCORSFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
&#13;
所以,我仍然得到错误,我该如何修复它。
答案 0 :(得分:1)
根据我的经验,当*
设置为Access-Control-Allow-Origin
时,Access-Control-Allow-Credentials
无法为true
工作。
所以,你应该有
response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8000");
实际上,您可以将其作为属性,而不是对网址进行硬编码。如果您想允许多个来源,this answer会有所帮助。
此外:
@Order(Ordered.HIGHEST_PRECEDENCE)
为该课程添加注释,因为此过滤器应首先出现。Access-Control-Allow-Headers
的列表中。<强>更新强>:
正如 @RTzhong 所做的那样(请参阅下面的评论),将*
替换为request.getHeader("Origin")
似乎是理想的解决方法。但是,更好的安全措施通常是指定实际网址或第一个checking with a whitelist,除非必须公开将其API公开给未知网站。
有关具体示例,请参阅Spring Lemon的源代码。