精华内容
下载资源
问答
  • springboot后端简单解决跨域问题
    2021-07-19 17:39:57

    有个注解@CrossOrigin(origins = "*",allowCredentials="true",allowedHeaders = "*",methods = {})是解决跨域问题的,这个注解可以加在方法上,也可以加在类上,但是作者没因为时间原因暂时没有调通,所以用了下面的方法解决了跨域的问题:

    @Configuration
    public class CorsConfiguration {
        @Bean
        public FilterRegistrationBean corsFilter() {
            UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
            org.springframework.web.cors.CorsConfiguration config = new org.springframework.web.cors.CorsConfiguration();
            //加上了这一句,大致意思是可以携带 cookie
            //最终的结果是可以 在跨域请求的时候获取同一个 session
            config.setAllowCredentials(true);
            // * 表示对所有的地址都可以访问
            config.addAllowedOrigin("*");
            // 跨域的请求头
            config.addAllowedHeader("*");
            //  跨域的请求方法
            config.addAllowedMethod("*");
            //配置 可以访问的地址
            source.registerCorsConfiguration("/**", config);
    
            FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
            bean.setOrder(0);
            return bean;
        }
    }

    有可能在nginx配置了相同的解决跨域配置的时候,会报一些重复性配置的错误,会在response中请求头报文中出现重复的配置,这个时候,服务端可以通过以下方法移除请求头中重复的配置:

    private void removeResponseHeader(ServletResponse rsp) {
            HttpServletResponse response = (HttpServletResponse) rsp;
            try {
                HttpServletResponse httpServletResponse = (HttpServletResponse) response;
                Field declaredField = ResponseFacade.class.getDeclaredField("response");
                declaredField.setAccessible(true);
                Response resp = (Response) declaredField.get(response);
                org.apache.coyote.Response coyoteResponse = resp.getCoyoteResponse();
                MimeHeaders mimeHeaders = coyoteResponse.getMimeHeaders();
                mimeHeaders.removeHeader("Access-Control-Allow-Origin");//如:Access-Control-Allow-Origin重复,删除你要删除的header的配置
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    更多相关内容
  • 后端如何解决跨域问题

    千次阅读 2021-03-22 17:17:48
    后端如何解决跨域问题 首先我门要知道什么是跨域跨域是指 不同域名之间相互访问。跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。 也就是...

    后端如何解决跨域问题

    首先我门要知道什么是跨域:

    跨域是指 不同域名之间相互访问。跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。

    也就是如果在A网站中,我们希望使用Ajax来获得B网站中的特定内容
    如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题。

    什么是同一个域?

    同一协议,同一ip,同一端口,三同中有一不同就产生了跨域。

    前端解决跨域:

    前边也说了,跨域是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。

    解决:
    所以搞一个node 服务器做代理,发出请求到node 服务器,node服务器转发到后端就可以绕过跨域问题。

    后端解决跨域问题:

    后端解决就比较简单了。例如我用的springboot,只用在Controller类上添加一个@CrossOrigin注解就可以实现对当前controller 的跨域 访问了,当然这个标签也可以加到方法上。

    @RequestMapping(value = "/users")
    @RestController
    @CrossOrigin
    public class UserController {
    	
    	@Autowired
    	private UserService userService;
    
        @RequestMapping(method = RequestMethod.POST)
        @CrossOrigin
        public User create(@RequestBody @Validated User user) {
    		return userService.create(user);
        }

    相关知识:

    CSRF是什么?

    CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

    解决方法2

    新建跨域配置文件如下即可

    /**
     * @author yyb
     */
    @Configuration
    public class CorsConfiguration {
        @Bean
        public WebMvcConfigurer corsConfigurer() {
            return new WebMvcConfigurer() {
                @Override
                public void addCorsMappings(CorsRegistry registry) {
                    registry.addMapping("/**")
                            .allowCredentials(false)
                            .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
                            .allowedOrigins("*");
                }
            };
        }
    
    }
    
    
    展开全文
  • java后端解决跨域问题

    2020-12-18 23:15:10
    java后端解决跨域问题 ##首先我门要知道什么是跨域跨域是指 不同域名之间相互访问。跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。 也就是...

    java后端解决跨域问题

    ##首先我门要知道什么是跨域:

    跨域是指 不同域名之间相互访问。跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。

    也就是如果在A网站中,我们希望使用Ajax来获得B网站中的特定内容
    如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题。

    ##什么是同一个域?
    同一协议,同一ip,同一端口,三同中有一不同就产生了跨域。

    #前端解决跨域:
    前边也说了,跨域是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。
    解决:
    所以搞一个node 服务器做代理,发出请求到node 服务器,node服务器转发到后端就可以绕过跨域问题。

    1、后端解决跨域问题:
    后端解决就比较简单了。例如我用的springboot,只用在Controller类上添加一个“@CrossOrigin“注解就可以实现对当前controller 的跨域 访问了,当然这个标签也可以加到方法上。

    @RequestMapping(value = "/users")
    @RestController
    @CrossOrigin
    public class UserController {
    	
    	@Autowired
    	private UserService userService;
    
        @RequestMapping(method = RequestMethod.POST)
        @CrossOrigin
        public User create(@RequestBody @Validated User user) {
    		return userService.create(user);
        }
       }
    
    

    #相关知识:
    CSRF是什么?

    CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

    2、
    新建跨域配置文件如下即可

    /**
     * @author yyb
     */
    @Configuration
    public class CorsConfiguration {
        @Bean
        public WebMvcConfigurer corsConfigurer() {
            return new WebMvcConfigurer() {
                @Override
                public void addCorsMappings(CorsRegistry registry) {
                    registry.addMapping("/**")
                            .allowCredentials(false)
                            .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
                            .allowedOrigins("*");
                }
            };
        }
    
    }
    

     

    3、使用过滤器

    允许整个项目跨域访问,可通过filter来进行过虑:

    public class SimpleCORSFilter implements Filter{  
      
        @Override  
        public void destroy() {  
              
        }  
      
        @Override  
        public void doFilter(ServletRequest req, ServletResponse res,  
                FilterChain chain) throws IOException, ServletException {  
                HttpServletResponse response = (HttpServletResponse) res;  
                response.setHeader("Access-Control-Allow-Origin", "*");  
                response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");  
                response.setHeader("Access-Control-Max-Age", "3600");  
                response.setHeader("Access-Control-Allow-Headers", "x-requested-with");  
                chain.doFilter(req, res);  
              
        }  
      
        @Override  
        public void init(FilterConfig arg0) throws ServletException {  
              
        }  
      
    }
    

     

    在web.xml中需要添加如下配置:

    <filter>  
          <filter-name>cors</filter-name>  
          <filter-class>com.ssm.web.filter.SimpleCORSFilter</filter-class>  
        </filter>  
        <filter-mapping>  
          <filter-name>cors</filter-name>  
          <url-pattern>/*</url-pattern>  
        </filter-mapping>
    </filter>
    

    为单个方法提供跨域访问,直接添加请求头:

           response.setHeader("Access-Control-Allow-Origin", "*");  
                response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");  
                response.setHeader("Access-Control-Max-Age", "3600");  
                response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
    

    4、后台Http请求转发

    使用HttpClinet转发进行转发(简单的例子 不推荐使用这种方式)

    try {
        HttpClient client = HttpClients.createDefault();            //client对象
        HttpGet get = new HttpGet("http://localhost:8080/test");    //创建get请求
        CloseableHttpResponse response = httpClient.execute(get);   //执行get请求
        String mes = EntityUtils.toString(response.getEntity());    //将返回体的信息转换为字符串
        System.out.println(mes);
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    5、后台配置同源Cors (推荐)

    在SpringBoot2.0 上的跨域 用以下代码配置 即可完美解决你的前后端跨域请求问题

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.cors.CorsConfiguration;
    import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
    import org.springframework.web.filter.CorsFilter;
    /**
     * 实现基本的跨域请求
     * @author linhongcun
     *
     */
    @Configuration
    public class CorsConfig {
        @Bean
        public CorsFilter corsFilter() {
            final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
            final CorsConfiguration corsConfiguration = new CorsConfiguration();
            /*是否允许请求带有验证信息*/
            corsConfiguration.setAllowCredentials(true);
            /*允许访问的客户端域名*/
            corsConfiguration.addAllowedOrigin("*");
            /*允许服务端访问的客户端请求头*/
            corsConfiguration.addAllowedHeader("*");
            /*允许访问的方法名,GET POST等*/
            corsConfiguration.addAllowedMethod("*");
            urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
            return new CorsFilter(urlBasedCorsConfigurationSource);
        }
    }
    

    6、使用SpringCloud网关

    服务网关(zuul)又称路由中心,用来统一访问所有api接口,维护服务。
    Spring Cloud Zuul通过与Spring Cloud Eureka的整合,实现了对服务实例的自动化维护,所以在使用服务路由配置的时候,我们不需要向传统路由配置方式那样去指定具体的服务实例地址,只需要通过Ant模式配置文件参数即可
    

    7、使用nginx做转发

    现在有两个网站想互相访问接口 在http://a.a.com:81/A中想访问 http://b.b.com:81/B 那么进行如下配置即可
    然后通过访问 www.my.com/A 里面即可访问 www.my.com/B

    s

    erver {
            listen       80;
            server_name  www.my.com;
            location /A {
                proxy_pass  http://a.a.com:81/A;
                index  index.html index.htm;
            }
            location /B {
                proxy_pass  http://b.b.com:81/B;
                index  index.html index.htm;
            }
        }
    

    如果是两个端口想互相访问接口 在http://b.b.com:80/Api中想访问 http://b.b.com:81/Api 那么进行如下配置即可
    使用nginx转发机制就可以完成跨域问题

    server {
            listen       80;
            server_name  b.b.com;
            location /Api {
                proxy_pass  http://b.b.com:81/Api;
                index  index.html index.htm;
            }
        }

    参考:

    https://abelyang.blog.csdn.net/article/details/71436415

    https://blog.csdn.net/qq_37651267/article/details/93367870 

    展开全文
  • 浏览器存在跨域问题的原因:https://www.zhihu.com/question/26379635 CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。 cloud...

    浏览器存在跨域问题的原因:https://www.zhihu.com/question/26379635

    CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

    cloud项目:

    /**
     * 跨域允许
     */
    @Configuration
    public class Cors {
        private static final String MAX_AGE = "18000L";
    
        @Bean
        public WebFilter corsFilter() {
            return (ServerWebExchange ctx, WebFilterChain chain) -> {
                ServerHttpRequest request = ctx.getRequest();
                if (CorsUtils.isCorsRequest(request)) {
                    HttpHeaders requestHeaders = request.getHeaders();
                    ServerHttpResponse response = ctx.getResponse();
                    HttpMethod requestMethod = requestHeaders.getAccessControlRequestMethod();
                    HttpHeaders headers = response.getHeaders();
                    headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, requestHeaders.getOrigin());
                    headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS,"Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");
                    headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
                    headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");
                    headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, MAX_AGE);
                    if (request.getMethod() == HttpMethod.OPTIONS) {
                        response.setStatusCode(HttpStatus.OK);
                        return Mono.empty();
                    }
                }
    
                return chain.filter(ctx);
            };
        }
    
        @Bean
        public ServerCodecConfigurer serverCodecConfigurer() {
            return new DefaultServerCodecConfigurer();
        }
    
        @Bean
        public HiddenHttpMethodFilter hiddenHttpMethodFilter() {
            return new HiddenHttpMethodFilter() {
                @Override
                public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
                    return chain.filter(exchange);
                }
            };
        }
    }
    

    其他参考:https://www.jianshu.com/p/a46e62f9ad1c

    展开全文
  • 主要介绍了前后端分离 vue+springboot 跨域 session+cookie失效问题解决方法,解决过程也很简单 ,需要的朋友可以参考下
  • 后端(springboot)解决跨域问题

    万次阅读 多人点赞 2017-05-08 22:14:14
    首先我门要知道什么是跨域跨域是指 不同域名之间...如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题。什么是同一个域?同一协议,同一ip,同一端口,三同中有一不同就产生了跨域。前端解决跨域:前边也
  • 允许整个项目跨域访问,可通过filter来进行过虑: public class SimpleCORSFilter implements Filter{ @Override public void destroy() { } @Override public void doFilter(Servle...
  • 一、Session跨域 所谓session跨域就是摒弃了系统(tomcat)提供的session,而使用自定义的类似Session的机制来保存客户端数据的一种解决方案。...这种机制是Session的跨域解决。 什么是域,在应用模型中一个完
  • Java 后端处理跨域问题

    千次阅读 2018-03-09 16:42:41
    解决方式:response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.set...
  • 跨域问题有多种解决方案,笔者认为最简单的办法的就是用 nginx 反向代理将不同源的静态站点和后端 rest 接口转换为同源,这样在浏览器端打开就不存在跨域问题了,当然这并不是接下来介绍的解决方案。 Spring MVC ...
  • // String allowHeaders = appConfig.getProperty(ALLOW_HEADERS, "Origin, Content-Type, Accept, sessionid, app, attr, rcuuid"); // String exposeHeaders = appConfig.getProperty("Access-Control-Expose-...
  • Session跨域共享问题解决

    万次阅读 2018-09-14 10:43:49
    1.Session跨域存在的问题 不同的域名下,Session无法共享。即设定用户在www.a.com登录,后端在Session中放入了用户的username和age,用户从www.a.com跳转到www.b.com,无法获取到Session中的用户信息。 演示: ...
  • 后端项目部署到服务器,并设置允许跨域访问后,本地前端项目使用服务器上后端项目接口时,问题来了:首先,使用postman测试获取图片验证码接口和验证图片验证码接口,正常。然后,在html中使用获取图片验证码接口,...
  • 首先我门要知道什么是跨域跨域是指 不同域名之间相互访问。...如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题。 什么是同一个域? 同一协议,同一ip,同一端口,三同中有一不同就产生了跨域。 ...
  • 转自: 月慕向阳 的 《java后端解决跨域问题(过滤器或者注解)》 原址:https://blog.csdn.net/weixin_41796956/article/details/84133901   1。允许整个项目跨域访问,可通过filter来进行过虑: public ...
  • 文章目录一招解决Servlet作为后端出现的跨域以及SessionID不一致问题一、引言二、Servlet解决跨域三、解决跨域sessionID不一致的问题四、总结 一招解决Servlet作为后端出现的跨域以及SessionID不一致问题 一、引言 ...
  • 一:什么是跨域问题 源于JavaScript的同源策略。即只有 协议+主机名+端口号全部相同,才允许相互访问。如果其中有一个不同,正常情况下浏览器就会把收到的报文丢弃,然后报一个cors policy的错误。 二:出现情况...
  • 说明总结了一下SSM中解决跨域的几种方式。如果项目是用SpringBoot构建的,则有更加优雅的解决方式:https://www.cnblogs.com/phdeblog/p/13260784.html当一个资源从与该资源本身所在的服务器不同的域、协议或端口...
  • 前后端分离解决session跨域丢失问题

    千次阅读 2018-12-04 20:31:12
    最近在做一个短信的平台,采用前后端分离的形式,前端vue,后端tp5,在登陆的时候出现了一个问题,登陆成功之后,拉取数据的接口在判断登陆时发现获取不到session_id,导致无法验这里是引用证登陆。 首先排错,在...
  • 目前接手一个Javaweb项目,属于半成品的那种,前端代码和Java代码在一个项目中,这种情况也就不存在什么跨域问题,可是我不擅长写前端,于是公司找了个前端加入项目团队,我就将前端的代码给到他,我写后端接口服务...
  • *前后端交互中的跨域,cookie,session问题 一·跨域 1.概念 跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。跨域是指不同域之间相互访问。 也就是...
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-...问题背景 这两天遇到一个这样的需求: 有两个项目a和b,在a项目中有页面需要调用b中的接口,两项目的域名不同,分别为a.com, b.com。这时...
  • 首先启动类上肯定需要声明跨域 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org....
  • 导致session丢失的原因也有很多,大致有spring security、shiro等安全框架的拦截,自定义过滤器的拦截、不同浏览器内核版本的限制,服务器的配置等等,首先要确认自己遇到这个问题是什么原因导致的,再去做相

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,217
精华内容 4,886
关键字:

后端解决session跨域问题