springboot 跨域cookie


springboot跨域cookie

跨域请求默认不会发送cookie数据,需做在请求发送端、服务端做一些配置才能发送、读取cookie数据

************************

应用 1

****************

config层

WebConfig

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/index").setViewName("index");
    }
}

****************

controller层

HelloController

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public Map<String,String> hello(HttpServletRequest request){
        Enumeration<String> headers=request.getHeaderNames();
        while (headers.hasMoreElements()){
            String header=headers.nextElement();

            System.out.println(header+" ==> "+request.getHeader(header));
        }

        Map<String,String> map=new HashMap<>();
        map.put("info","hello,瓜田李下");

        return map;
    }
}

****************

前端页面

index.html

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org" xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="/js/jquery-3.5.1.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#btn").click(function () {
                $.get({
                    url: "/hello",
                    success: function (result) {
                        $("#data").html(result.info)
                    }
                })
            });

            $("#btn2").click(function () {
                $.get({
                    url: "http://localhost:8081/hello",
                    crossDomain: true,
                    xhrFields: {
                        withCredentials: true
                    },
                    success: function (result) {
                        $("#data2").html(result.info)
                    }
                })
            });
        })
    </script>
</head>
<body>
<div th:align="center">
    <button id="btn">获取数据</button>
    <button id="btn2">获取数据2</button><br>
    <span id="data"></span><br>
    <span id="data2"></span>
</div>
</body>
</html>

************************

应用 2

****************

config层

WebConfig

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:8080")
                .allowCredentials(true);
    }
}

****************

controller层

HelloController

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public Map<String,String> hello(HttpServletRequest request){
        Enumeration<String> headers=request.getHeaderNames();
        while (headers.hasMoreElements()){
            String header=headers.nextElement();

            System.out.println(header+" ==> "+request.getHeader(header));
        }

        Map<String,String> map=new HashMap<>();
        map.put("info","欢迎你");

        return map;
    }
}

************************

使用测试

localhost:8080/index

****************

点击获取数据、获取数据2,控制台输出

应用 1

2020-07-08 10:56:09.407  INFO 1488 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2020-07-08 10:56:09.414  INFO 1488 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 7 ms
host ==> localhost:8080
connection ==> keep-alive
accept ==> */*
x-requested-with ==> XMLHttpRequest
user-agent ==> Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
referer ==> http://localhost:8080/index
accept-encoding ==> gzip, deflate, br
accept-language ==> zh-CN,zh;q=0.9
cookie ==> isg=BJiYP7OIcordkV4OUKLufIy5acYqgfwLBTEbVdKJqlOGbThXepNTm7QMoaXdorTj

应用 2

2020-07-08 10:56:22.400  INFO 16104 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2020-07-08 10:56:22.410  INFO 16104 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 10 ms
host ==> localhost:8081
connection ==> keep-alive
accept ==> */*
origin ==> http://localhost:8080
user-agent ==> Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
referer ==> http://localhost:8080/index
accept-encoding ==> gzip, deflate, br
accept-language ==> zh-CN,zh;q=0.9
cookie ==> isg=BJiYP7OIcordkV4OUKLufIy5acYqgfwLBTEbVdKJqlOGbThXepNTm7QMoaXdorTj

应用 2可读取属于应用 1的cookie数据

Spring Boot 跨域和 Session Cookie失效问题的解决方法如下: 首先,跨域问题可以通过配置Spring Boot的CORS(跨源资源共享)来解决。在Spring Boot中,可以使用注解 `@CrossOrigin` 或在配置类中添加 `addCorsMappings` 方法来配置跨域的访问。 @CrossOrigin 注解可以应用在控制器类或方法上,指定允许跨域的来源、方法、头部、是否允许携带凭证(比如 Cookie)等参数。例如: ```java @CrossOrigin(origins = "http://localhost:8080", maxAge = 3600, allowCredentials = "true") @GetMapping("/example") public ResponseEntity<String> getExample() { // ... } ``` 另一种配置跨域的方法是创建配置类,并继承 `WebMvcConfigurer` 接口,并重写其 `addCorsMappings` 方法。例如: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("http://localhost:8080") .allowedMethods("GET", "POST") .allowCredentials(true) .maxAge(3600); } } ``` 其次,Session Cookie失效问题可以通过在跨域请求中添加凭证(Credentials)来解决。具体来说,可以将 `allowCredentials` 参数设置为 `true`,同时在请求头中添加 `withCredentials: true`。例如: ```javascript fetch('http://localhost:8080/api/example', { method: 'GET', credentials: 'include' // 或 'same-origin' }) ``` 这样配置后,Spring Boot就可以正常接收带有 Cookie跨域请求,并在服务端保持 Session 的有效性。 综上所述,通过配置跨域设置和同时在请求中添加凭证,可以解决Spring Boot跨域和Session Cookie失效的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值