当Ajax跨域访问,明明已经获取到访问的json数据但是浏览器报错CORS 头缺少 ‘Access-Control-Allow-Origin’ ;
解决方式一:
过滤器
package com.xet.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.StringUtils;
public class CrosFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("进入filter");
HttpServletResponse res = (HttpServletResponse)response;
HttpServletRequest req = (HttpServletRequest) request;
String origin = req.getHeader("Origin");
if(!StringUtils.isEmpty(origin) ) {
res.addHeader("Access-Control-Allow-Origin", origin);
}
res.addHeader("Access-Control-Allow-Methods", "*");
//post请求 带Json参数
res.addHeader("Access-Control-Allow-Headers","content-type");
//在指定时间内 缓存预检命令
res.addHeader("Access-Control-Max-Age","3600");
chain.doFilter(request, response);
}
}
2.在web.xml中注册该过滤器
<!-- 过滤器配置 -->
<filter>
<display-name>ajax过滤器</display-name>
<filter-name>CrosFilter</filter-name>
<filter-class>com.xet.filter.CrosFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CrosFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
或者springboot注册过滤器
package com.xet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import com.xet.controller.CrosFilter;
@SpringBootApplication
public class AjaxServerApplication {
public static void main(String[] args) {
SpringApplication.run(AjaxServerApplication.class, args);
}
@Bean
public FilterRegistrationBean registerFiler() {
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.addUrlPatterns("/*");
bean.setFilter(new CrosFilter());
return bean;
}
}
第二种利用Spring框架注解@CrossOrigin
在ajax请求的类或者方法上加@CrossOrigin注解
package com.xet.controller;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
@CrossOrigin
public class TestController {
@GetMapping("/get1")
private ResultBean get1(HttpServletResponse res) {
System.out.println("TestController get1()");
return new ResultBean(200, "get1 ok");
}
@PostMapping("/postJson")
private ResultBean postJson(@RequestBody User user) {
System.out.println("TestController.postJson");
return new ResultBean(200, "postJson"+user.getName());
}
}{