我们在前端页面使用ajax访问后台Controller时有时会出现类似这样的问题:
No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘http://localhost:63342’ is therefore not allowed access.
这表示跨域访问被拒绝了。
我们可以在后台的 Controller的方法里加上这么一行代码:
response.setHeader("Access-Control-Allow-Origin", "*");
即可解决问题。
不过这样写代码比较丑陋,我们可以把这样的代码放到一个filter里,把filter在web.xml里配置上即可。
filter代码如下:
package com.demo.common.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;
/**
* 处理ajax跨域问题
*/
public class CrossAjaxFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "Origin,X-Requested-With,Content-Type,Accept");
response.setCharacterEncoding("UTF-8");
filterChain.doFilter(request, response);
}
}
web.xml里配置如下:
<!-- 解决跨域问题 -->
<filter>
<filter-name>crossAjax</filter-name>
<filter-class>com.demo.common.filter.CrossAjaxFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>crossAjax</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>