<强>一。方法:强>
-
<李>服务端设置响应头头中Access-Control-Allow-Origin李>
<李>配合前台使用jsonp李>
<李>继承WebMvcConfigurerAdapter添加配置类
李>
<强>二。实例:强>
1。前端:因为我们用了前后端分离,前端用节点服务器,节点服务器再用了ajax反向代理请求到我的春天引导服务器。其中节点服务器也用了ajax发出请求所以也存在跨域的问题。具体代码:
app.all (apiRoot +“/*”,代理(127.0.0.1:+ proxyPort, { res forwardPath:函数(点播){ 控制台。日志(要求:,点播,res;”,res); 返回需要(url) .parse (req.url) .path; } }));
后台(用的是弹簧引导1.3.7.RELEASE):用了一个过滤器进行了身份验证同时进行了跨域处理,具体代码:
公共类AuthFilter实现滤波器{//@ autowired//这个不能自动注入servlet和滤波器是被tomcat管理的 私人BaseUserService BaseUserService; 私人String [] excludePaths; @Override FilterConfig FilterConfig公共空init()抛出ServletException { System.out.println (“initFilter”);//不能在初始化中通过Appliaction上下文获取因为这时候还没初始化应用程序上下文//baseUserService=SpringUtils。getBean (“baseUserService BaseUserService.class); excludePaths=new String [] {"/api/user/noLogin ", "/api/user/tokenError ", "/api/user/loginForeground”, “/api/user/loginBackground”、“/api/user/inCorrectUserId "}; } @Override 公共空间的doFilter (ServletRequest请求,ServletResponse响应FilterChain链)抛出IOException, ServletException { HttpServletRequest HttpServletRequest=(HttpServletRequest)请求; HttpServletResponse HttpServletResponse=(HttpServletResponse)反应;//这里填写你允许进行跨域的主机ip httpServletResponse。setHeader (“Access-Control-Allow-Origin”、“*”);//允许的访问方法 httpServletResponse。setHeader (“Access-Control-Allow-Methods”、“POST、GET、PUT、选择、删除补丁”);//Access-Control-Max-Age用于歌珥相关配置的缓存 httpServletResponse。setHeader (“Access-Control-Max-Age”、“3600”); httpServletResponse。setHeader (“Access-Control-Allow-Headers”、“起源、X-Requested-With内容类型,接受”); 字符串标识=request.getParameter(“标识”); 字符串标记=request.getParameter(“令牌”);//有令牌的“ 如果(userId !=零,,令牌!=null) { 尝试{ 整数id=Integer.parseInt (userId); 如果(baseUserService==null) baseUserService=SpringUtils。getBean (“baseUserService BaseUserService.class);=baseUserService int状态。checkLogin (id、令牌); 如果(状态==1){ 链。doFilter(请求、响应); }else if(状态==0){ httpServletResponse.sendRedirect ("/api/user/tokenError "); }else if(状态==2){ httpServletResponse.sendRedirect ("/api/user/inCorrectUserId "); 其他}{ httpServletResponse.sendRedirect ("/api/user/noLogin "); } }捕捉(NumberFormatException例外){ httpServletResponse.sendRedirect ("/api/user/inCorrectUserId "); } 其他}{ 字符串路径=httpServletRequest.getServletPath (); 如果(excludePath(路径)){ 链。doFilter(请求、响应); 其他}{ httpServletRequest.getRequestDispatcher (“/api/user/noLogin”)。提出(请求、响应); } }//((HttpServletResponse)响应)。addHeader (“Access-Control-Allow-Origin”、“*”);//CorsFilter CorsFilter=new CorsFilter (); } 私人布尔excludePath (String路径){ for (int i=0;我& lt;excludePaths.length;我+ +){ 如果(path.equals (excludePaths[我])) 返回true; } 返回错误; } @Override 公共空间摧毁(){ system . out。println(“销毁方法”); } } >之前这种方法还适用于servlet中,特别注意的是一定要在过滤器动作之前加上这句话,也就是在代码的最前面加上这个话。
跨域资源共享歌珥详解(相关链接)
2。详细请看(点开)
3 .具体代码:包edu.ecnu.yjsy.conf; 进口org.springframework.context.annotation.Configuration; 进口org.springframework.web.servlet.config.annotation.CorsRegistry; 进口org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @ configuration 公开课CorsConfig延伸WebMvcConfigurerAdapter { @Override 公共空间addCorsMappings (CorsRegistry注册表){ registry.addMapping (“/* *”) .allowedOrigins (“*”) .allowCredentials(真正的) .allowedMethods(“获得”、“后”、“删除”、“放”) .maxAge (3600); } }弹簧引导配合前端实现跨域请求访问