现在很多开发的API都支持ajax直接请求,这样就会导致跨域的问题,解决跨域的问题一方面可以从前端,另一方面就是服务器端。
既然是搞服务器端,做对外的API服务,当然是做到越简单越好,前端只需要傻傻的使用就好。
如何让服务器本身支持跨域请求呢?
创建一个Filter
package com.iot.common.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse; /** * @ClassName: CORSFilter * @Description: 支持跨域过滤器 * @author ZhangYong * @date 2018年1月17日 下午6:31:21 */ public class CORSFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) res; response.setHeader("Access-Control-Allow-Origin", "*");//允许跨域访问的域,可以是通配符”*”; response.setHeader("Access-Control-Allow-Methods", "POST, GET"); response.setHeader("Access-Control-Max-Age", "1800"); response.setHeader("Access-Control-Allow-Headers", "x-requested-with"); response.setHeader("Access-Control-Allow-Credentials", "true"); chain.doFilter(req, response); } @Override public void destroy() { } }
在web.xml文件中配置Filter
<filter> <filter-name>corsFilter</filter-name> <filter-class>com.iot.common.filter.CORSFilter</filter-class> </filter> <filter-mapping> <filter-name>corsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
需要注意的问题:
当前台设置了 withCredentials = true ,那么后台Access-Control-Allow-Origin 为 *不可用,二者不能同时使用