webentwicklung-frage-antwort-db.com.de

füge automatisch einen Header zu jeder Antwort hinzu

Ich möchte diesen Header "Access-Control-Allow-Origin", "*" zu jeder Antwort hinzufügen, die an den Client gesendet wird, wenn in meiner Anwendung eine Anforderung an Rest-Controller gestellt wurde, um die gemeinsame Nutzung von Ursprungsressourcen zu ermöglichen. Zur Zeit füge ich diesen Header manuell hinzu Header zu jeder Methode wie folgt

HttpHeaders headers = new HttpHeaders();
headers.add("Access-Control-Allow-Origin", "*");

Es funktioniert, ist aber sehr frustrierend. Ich habe webContentInterceptor in den Frühlingsdokumenten gefunden, mit denen wir die Header für jede Antwort ändern können

<mvc:interceptors>
<bean id="webContentInterceptor" 
class="org.springframework.web.servlet.mvc.WebContentInterceptor">
<property name="Access-Control-Allow-Origin" value="*"/>
</bean>
</mvc:interceptors>

aber wenn ich dies benutze, wirft es Fehler, dass die Eigenschaft des Namens Access-Control-Allow-Origin nicht gefunden wurde. Gibt es also eine andere Möglichkeit, jeder Antwort automatisch einen Header hinzuzufügen?

Update! Spring Framework 4.2 vereinfacht dies erheblich, indem die Annotation @CrossOrigin entweder einer Methode oder einem Controller selbst hinzugefügt wird https://spring.io/blog/2015/06/08/cors-support-in-spring-framework =

38
Mayank Sharma

Ich bin vor kurzem auf dieses Problem gekommen und habe diese Lösung gefunden. Sie können einen Filter verwenden, um diese Header hinzuzufügen:

import Java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;

public class CorsFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
            response.addHeader("Access-Control-Allow-Origin", "*");
            if (request.getHeader("Access-Control-Request-Method") != null
                    && "OPTIONS".equals(request.getMethod())) {
                // CORS "pre-flight" request
                response.addHeader("Access-Control-Allow-Methods",
                        "GET, POST, PUT, DELETE");
                response.addHeader("Access-Control-Allow-Headers",
                        "X-Requested-With,Origin,Content-Type, Accept");
            }
            filterChain.doFilter(request, response);
    }

}

Vergessen Sie nicht, den Filter in Ihren Frühlingskontext einzufügen:

<bean id="corsFilter" class="my.package.CorsFilter" />

und das Mapping in der web.xml:

<filter>
    <filter-name>corsFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>corsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Um noch ein bisschen weiter zu gehen, können Sie ein Federprofil angeben, um diesen Filter zu aktivieren oder zu deaktivieren:

<beans profile="!cors">
    <bean id="corsFilter" class="my.package.FilterChainDoFilter" />
</beans>

<beans profile="cors">
    <bean id="corsFilter" class="my.package.CorsFilter" />
</beans>

(Bereitstellung des FilterChainDoFilter ähnlich dem CorsFilter, der jedoch nur filterChain.doFilter(request, response); im doFilterInternal (..) ausführt.)

57
Dayde

Update! Spring Framework 4.2 vereinfacht dies erheblich, indem die Annotation @CrossOrigin entweder einer Methode oder einem Controller selbst hinzugefügt wird https://spring.io/blog/2015/06/08/cors-support-in-spring-framework =

15
Mayank Sharma

Wenn Sie Header für den Controller festlegen möchten, können Sie @ModelAttribute Anmerkung.

@ModelAttribute
public void setVaryResponseHeader(HttpServletResponse response) {
    response.setHeader("Vary", "Accept");
}    
5
Andrei N

In Spring 4 können Sie die Funktion @CrossOrigin () verwenden, mit der Sie das Origin-übergreifende Problem lösen können.

Aus Sicherheitsgründen verbieten Browser AJAX) Aufrufe von Ressourcen, die sich außerhalb des aktuellen Ursprungs befinden. Wenn Sie beispielsweise Ihr Bankkonto auf einer Registerkarte überprüfen, könnte sich die Website evil.com auf einer anderen befinden tab. Die Skripte von evil.com sollten nicht in der Lage sein, mit Ihren Zugangsdaten AJAX) Anfragen an Ihre Bank-API zu richten (Geld von Ihrem Konto abheben!).

Cross-Origin Resource Sharing (CORS) ist eine von den meisten Browsern implementierte W3C-Spezifikation, mit der Sie auf flexible Weise festlegen können, welche Art von domänenübergreifenden Anforderungen zulässig sind, anstatt einige weniger sichere und leistungsschwache Hacks wie IFrame oder JSONP zu verwenden.

Spring Framework 4.2 GA bietet erstklassigen Support für CORS, damit Sie es einfacher und leistungsfähiger konfigurieren können als typische filterbasierte Lösungen.

Sie können Ihrer mit @RequestMapping-Annotationen versehenen Handlermethode eine @ CrossOrigin-Annotation hinzufügen, um CORS darauf zu aktivieren. Standardmäßig lässt @CrossOrigin alle in der Annotation @RequestMapping angegebenen Ursprünge und HTTP-Methoden zu:

@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin
    @RequestMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cors.html

https://spring.io/guides/gs/rest-service-cors/

https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

1
Sudhakar

WebContentInterceptor hat keine Eigenschaft mit dem Namen Access-Control-Allow-Origin, und soweit ich sehen kann, werden keine Methoden zum Setzen von Antwort-Headern verfügbar gemacht. Es werden nur einige Cache-bezogene Header gesetzt, indem einige Eigenschaften aktiviert/deaktiviert werden. Es ist jedoch trivial, einen eigenen Interceptor (oder Servlet-Filter) zu schreiben, der dies ausführt.

0
NilsH

Ich bin auch mit diesem Problem konfrontiert und ich habe dieses Problem behoben.

public static HttpServletResponse getResponse(HttpServletResponse response) {
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setCharacterEncoding("UTF-8");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET");
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
    return response;
}
0
Poocholamannan