Páginas iframe anidadas, debido a la política del mismo origen, la cookie no se puede obtener, lo que resulta en una solución al problema de la falla de la sesión

Basta con configurar el identificador de sesión correspondiente a través de la puerta de enlace. El identificador de sesión se puede pasar a través del encabezado de la solicitud, y luego la puerta de enlace establecerá el identificador de sesión del encabezado de solicitud en la cookie.

package com.gateway.filter;


import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.net.URI;
import java.util.List;

@Component
public class SetCookieGlobalFilter implements GlobalFilter, Ordered {

    String cookieName = "SESSION_ID";
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest oldRequest= exchange.getRequest();
        HttpHeaders oldRequestHeaders = oldRequest.getHeaders();
        List<String> authorization = oldRequestHeaders.get("session_id_header");
        if(CollectionUtils.isEmpty(authorization)){
            return chain.filter(exchange);
        }else{
            String sessionId = authorization.get(0);
            URI uri = oldRequest.getURI();
            ServerHttpRequest newRequest = oldRequest.mutate().uri(uri).build();

            // 定义新的消息头
            HttpHeaders headers = new HttpHeaders();
            headers.putAll(oldRequestHeaders);
            headers.remove(HttpHeaders.COOKIE);
            headers.set(HttpHeaders.COOKIE, "NETINFO_SESSION_ID="+sessionId);
            newRequest = new ServerHttpRequestDecorator(newRequest) {
                @Override
                public HttpHeaders getHeaders() {
                    return headers;
                }
            };
            return chain.filter(exchange.mutate().request(newRequest).build());

        }
    }
    @Override
    public int getOrder() {
        return -2;
    }

}

おすすめ

転載: blog.csdn.net/weixin_41796956/article/details/130284164