重新认识一下跨域问题
package com.chaboshi.www.loginfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.util.concurrent.atomic.AtomicInteger; @WebFilter("/*") public class ACrosFilter implements Filter { private Logger logger = LoggerFactory.getLogger(ACrosFilter.class); private int second=60*60;// private AtomicInteger count; @Override public void init(FilterConfig filterConfig) throws ServletException { count=new AtomicInteger(); logger.info("跨域拦截器已经启动"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse resp = (HttpServletResponse) response; HttpServletRequest rest=(HttpServletRequest)request; String origin =null; if (null!=rest&&rest.getMethod().equals("OPTIONS")) { logger.info("收到预请求{"+rest.getHeader("Origin")+"}请求类型{"+rest.getMethod()+"}"); resp.setStatus(HttpServletResponse.SC_OK); } origin = rest.getHeader("Origin"); // 添加参数,允许任意domain访问 resp.setHeader("Access-Control-Allow-Origin", origin ); resp.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS"); resp.setHeader("Access-Control-Max-Age", "0"); // 被注释都得 Access-Control-Allow-Headers 属性值在测试环境是可以使用的,镜像不可以 resp.setHeader("Access-Control-Allow-Headers", "Accept,Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,TOKEN,Authorization,token");// //跨域允许携带Cookie 前端Ajax配合增加 // xhrFields: { // withCredentials: true // } 属性 这里注意的是 如果允许跨域Cookie 则Access-Control-Allow-Origin不能为* resp.setHeader("Access-Control-Allow-Credentials", "true"); resp.setCharacterEncoding("UTF-8"); resp.setHeader("Access-Control-Expose-Headers", "*");//响应客户端的头部 允许携带Token 等等 try { chain.doFilter(request, resp); } catch (Exception e) { response.setContentType("application/json; charset=utf-8"); response.setCharacterEncoding("UTF-8"); OutputStream out = resp.getOutputStream(); String message=e.getMessage(); out.write(message.getBytes("UTF-8")); out.flush(); } } @Override public void destroy() { count=null; logger.info(" 跨域拦截器已经销毁"); } }