此方案只需服务端的代码修改
因为现在要前后端分离开发,那必不可免的会出现跨域问题,以下是自己实际测试过的有效代码:
注:在配置Filter过滤器时,不能使用 @Resource @Autowired 等注解,否则会报 javax.naming.NamingException
spring通过扫描我们的代码,知道哪里使用了他的注解,然后生成动态baen,因为Fillter特殊的生命周期,所以Filter动态代理创建失败,会报 javax.naming.NamingException
步骤:
一、在 web.xml文件中添加
<!-- 2019-01-15 解决跨域问题 -->
<filter>
<filter-name>crossFilter</filter-name>
<filter-class>com.sx.test.controller.CorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>crossFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
二、在自己的项目中创建 CorsFilter.java文件
package com.sx.test.controller;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import javax.servlet.Filter;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//@WebFilter(filterName = "CORSFilter", urlPatterns = {"/*"})
//@Order(value = 1)
//@Configuration 这3个注解的作用 等同与web.xml 中配置的过滤映射 ,可以2选1
public class CorsFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws IOException, ServletException {
System.out.println("Filter 过滤器 执行 了");
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
// 响应标头指定 指定可以访问资源的URI路径
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
//响应标头指定响应访问所述资源到时允许的一种或多种方法
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
//设置 缓存可以生存的最大秒数
response.setHeader("Access-Control-Max-Age", "3600");
//设置 受支持请求标头(自定义 可以访问的请求头 例如:Token)
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Token");
//自定义 可以被访问的响应头
response.setHeader("Access-Control-Expose-Headers","checkTokenResult");
// 指示的请求的响应是否可以暴露于该页面。当true值返回时它可以被暴露
response.setHeader("Access-Control-Allow-Credentials","true");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
注:
上面代码中的注解作用:
@WebFilter 用于将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。@WebFilter常用属性:
@Order 注解主要用来控制配置类的加载顺序,其value为正整数,值越小优先度越高
@Configuration 从Spring3.0,@Configuration用于定义配置类
对于setHeader() 响应头相关的API 详解: https://cloud.tencent.com/developer/section/1189894
如果对你有帮助的话给评论个 1 对我鼓励下,如果有更好的方法或资源请不吝赐教