弹簧引导配合前端实现跨域请求访问

  

<强>一。方法:

  
      <李>服务端设置响应头头中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);   }      }      

弹簧引导配合前端实现跨域请求访问