• java后台解决跨域问题


    首先说一下什么是跨域?

    跨域是指一个页面想获取另一个页面中的资源,如果这两个页面的协议、域名、子域名、端口不同,或者两个页面一个为IP地址另一个为域名地址,这种情况下所进行的访问行动都是跨域的。而出于安全性的考虑,浏览器通常会限制跨域访问,不允许跨域请求资源。

    JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。那什么是跨域呢,简单地理解就是因为JavaScript同源策略的限制,a.com域名下的js无法操作b.com或是c.a.com域名下的对象。

    当协议、子域名、主域名、端口号中任意一个不相同时,都算作不同域。不同域之间相互请求资源,就算作“跨域”。

    JavaScript由于安全性方面的考虑,不允许页面跨域调用其他页面的对象,那么问题来了,什么是跨域问题?

    答:这是由于浏览器同源策略的限制,现在所有支持JavaScript的浏览器都使用了这个策略。那么什么是同源呢?所谓的同源是指三个方面“相同”:
    1,域名相同
    2,协议相同
    3,端口相同

    例如:
    
    http://www.abc.com/index.html 请求 http://www.efg.com/service.php。
    
    http://www.a.com/a.js
    http://www.a.com/b.js 同一域名 允许
    
    http://www.a.com/a.js 
    http://www.b.com/a.js  不同域名    不允许
    
    http://www.a.com:8000/a.js
    http://www.a.com/b.js  同一域名不同端口    不允许
    
    https://www.a.com/a.js 
    http://www.a.com/b.js  同一域名不同协议    不允许
    
    以上这些都属于存在跨域问题!!!
    

    有一点必须要注意:跨域并不是请求发不出去,请求能发出去,服务端能收到请求并正常返回结果,只是结果被浏览器拦截了。之所以会跨域,是因为受到了同源策略的限制,同源策略要求源相同才能正常进行通信,即协议、域名、端口号都完全一致。

    解决跨域问题的方式有很多,这里主要是添加注解的方式和采用添加拦截器的方法:

    方法一、spring boot中只用在Controller类上添加一个“@CrossOrigin“注解就可以实现对当前controller 的跨域 访问了,当然这个标签也可以加到方法上。

    注意:“@CrossOrigin“注解要求jdk1.8以上版本

    @CrossOrigin
    public class CommonController {
    
    }
    

    方法二、采用添加拦截器的方法

    @Configuration
    public class WebConfig extends WebMvcConfigurerAdapter {
        @Autowired
        private EnvConfig envConfig;
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new HandlerInterceptor() {
                @Override
                public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                        throws Exception {
                    boolean isTrue = envConfig.getIsDev();//判断是测试服才需要解决跨域问题
                    if (isTrue) {
                        response.addHeader("Access-Control-Allow-Origin", "*");
                 response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
                        response.addHeader("Access-Control-Allow-Headers",
                                "Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,token");
                    }
                    return true;
                }
    
                @Override
                public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                        ModelAndView modelAndView) throws Exception {
    
                }
    
                @Override
                public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                        Exception ex) throws Exception {
                }
            });
        }
    }
    
    
  • 相关阅读:
    C#:将空间数据加载到树视图控件
    C# 常见错误
    C#:Application操作(待补充)
    C#:XML操作(简单)
    C#:xml操作(待补充)
    C#:消息框
    C#:数学运算(待补充)
    C#:Ini文件操作(待补充)
    C#:文件操作(待补充)
    2015河南省农村拆迁赔偿流程
  • 原文地址:https://www.cnblogs.com/yuqiliu/p/12684624.html
Copyright © 2020-2023  润新知