java后端通过Filter过滤器解决跨域问题

此方案只需服务端的代码修改

因为现在要前后端分离开发,那必不可免的会出现跨域问题,以下是自己实际测试过的有效代码:

:在配置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 对我鼓励下,如果有更好的方法或资源请不吝赐教

猜你喜欢

转载自blog.csdn.net/qq_42715494/article/details/86496027