Heim >php教程 >PHP开发 >cros domänenübergreifende Konfiguration

cros domänenübergreifende Konfiguration

高洛峰
高洛峰Original
2016-12-14 13:14:301304Durchsuche

Die Front-End-Anwendung ist eine statische Site und wird unter der Domäne http://web.xxx.com bereitgestellt. Die Back-End-Anwendung veröffentlicht die REST-API und wird unter der Domäne http://api.xxx.com bereitgestellt Domäne. Wie lässt sich die Front-End-Anwendung AJAX übergeben? Was ist mit dem domänenübergreifenden Zugriff auf Back-End-Anwendungen? Dies erfordert den Einsatz der CORS-Technologie, die derzeit die beste Lösung darstellt.

[CORS steht für Cross Origin Resource Sharing (domänenübergreifende Ressourcenfreigabe). Der Server muss nur relevante Antwortheaderinformationen hinzufügen, damit der Client domänenübergreifende AJAX-Anfragen stellen kann. ]

Die CORS-Technologie ist sehr einfach und leicht zu implementieren. Derzeit unterstützen die meisten Browser diese Technologie (der IE8-Browser unterstützt sie auch). Der Server kann über jede Programmiersprache implementiert werden, sofern er auf CORS reagieren kann Schreiben Sie einfach den Header in das Antwortobjekt.

Als nächstes erweitern wir das REST-Framework weiter und implementieren den domänenübergreifenden AJAX-Zugriff durch CORS-Technologie.

Zuerst müssen wir einen Filter schreiben, um alle HTTP-Anfragen zu filtern und den CORS-Antwortheader in das Antwortobjekt zu schreiben. Der Code lautet wie folgt:

public class CorsFilter implements Filter {  
  
    private String allowOrigin;  
    private String allowMethods;  
    private String allowCredentials;  
    private String allowHeaders;  
    private String exposeHeaders;  
  
    @Override  
    public void init(FilterConfig filterConfig) throws ServletException {  
        allowOrigin = filterConfig.getInitParameter("allowOrigin");  
        allowMethods = filterConfig.getInitParameter("allowMethods");  
        allowCredentials = filterConfig.getInitParameter("allowCredentials");  
        allowHeaders = filterConfig.getInitParameter("allowHeaders");  
        exposeHeaders = filterConfig.getInitParameter("exposeHeaders");  
    }  
  
    @Override  
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {  
        HttpServletRequest request = (HttpServletRequest) req;  
        HttpServletResponse response = (HttpServletResponse) res;  
        if (StringUtil.isNotEmpty(allowOrigin)) {  
            List<String> allowOriginList = Arrays.asList(allowOrigin.split(","));  
            if (CollectionUtil.isNotEmpty(allowOriginList)) {  
                String currentOrigin = request.getHeader("Origin");  
                if (allowOriginList.contains(currentOrigin)) {  
                    response.setHeader("Access-Control-Allow-Origin", currentOrigin);  
                }  
            }  
        }  
        if (StringUtil.isNotEmpty(allowMethods)) {  
            response.setHeader("Access-Control-Allow-Methods", allowMethods);  
        }  
        if (StringUtil.isNotEmpty(allowCredentials)) {  
            response.setHeader("Access-Control-Allow-Credentials", allowCredentials);  
        }  
        if (StringUtil.isNotEmpty(allowHeaders)) {  
            response.setHeader("Access-Control-Allow-Headers", allowHeaders);  
        }  
        if (StringUtil.isNotEmpty(exposeHeaders)) {  
            response.setHeader("Access-Control-Expose-Headers", exposeHeaders);  
        }  
        chain.doFilter(req, res);  
    }  
  
    @Override  
    public void destroy() {  
    }  
}

Der obige CorsFilter wird sein Wird aus dem Web verwendet. Lesen Sie die relevanten Filterinitialisierungsparameter aus .xml und schreiben Sie diese Parameter in die entsprechenden CORS-Antwortheader, wenn Sie HTTP-Anfragen verarbeiten. Im Folgenden wird kurz die Bedeutung dieser CORS-Antwortheader beschrieben:


Access-Control-Allow-Origin: Der Client-Domänenname, auf den zugegriffen werden darf, zum Beispiel: http://web.xxx.com. Wenn es * ist, bedeutet dies, dass darauf zugegriffen werden kann von jeder Domain, also ohne Einschränkungen.

Access-Control-Allow-Methods: Methodennamen, die den Zugriff ermöglichen, werden durch Kommas getrennt, wie zum Beispiel: GET, POST, PUT, DELETE, OPTIONS.

Access-Control-Allow-Credentials: Ob Anfragen mit Verifizierungsinformationen zugelassen werden sollen. Wenn Sie Cookies unter der Client-Domäne erhalten möchten, müssen Sie diese auf „true“ setzen.

Access-Control-Allow-Header: Client-Anforderungsheader, die den Serverzugriff ermöglichen, werden durch Kommas getrennt, zum Beispiel: Content-Type.

Access-Control-Expose-Headers: Server-Antwortheader, die den Clientzugriff ermöglichen, werden durch Kommas getrennt.

Es ist zu beachten, dass die CORS-Spezifikation definiert, dass Access-Control-Allow-Origin nur zwei Werte zulässt, entweder * oder einen bestimmten Domänennamen. Mit anderen Worten, die gleichzeitige Konfiguration mehrerer Domänennamen ist nicht möglich unterstützt. Um das Problem über mehrere Domänen hinweg zu lösen, muss im Code etwas verarbeitet werden. Hier wird der Filterinitialisierungsparameter als Sammlung von Domänennamen (durch Kommas getrennt) verwendet. Rufen Sie einfach den Origin-Anforderungsheader aus der aktuellen Anforderung ab Um zu wissen, von welcher Domäne sie stammt, wird sie in den Antwortheader „Access-Control-Allow-Origin“ eingefügt, wenn sich die Anforderung im oben genannten Satz zulässiger Domänen befindet, sodass das Problem der Überschneidung mehrerer Domänen leicht gelöst werden kann.

Im Folgenden erfahren Sie, wie Sie CorsFilter im Web konfigurieren. Die von der Back-End-Anwendung veröffentlichte REST-API kann beliebig aufgerufen werden, ohne dass sich der Benutzer anmeldet. Dies ist offensichtlich unsicher. Wir müssen einen Sicherheitsmechanismus für REST-Anfragen bereitstellen.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn