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

2019-01-16 05:51:11来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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

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

步骤:

一、在 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
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");

        //设置  受支持请求标头
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");

        // 指示的请求的响应是否可以暴露于该页面。当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 对我鼓励下,如果有更好的方法或资源请不吝赐教


原文链接:https://www.cnblogs.com/fss93/p/10275828.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:day02_品优购电商项目_02_前端框架AngularJS入门 + 品牌列表的实

下一篇:JAVA线程池之newFixedThreadPool实战