web-dev-qa-db-fra.com

ajouter automatiquement un en-tête à chaque réponse

Je veux ajouter cet en-tête "Access-Control-Allow-Origin", "*" à chaque réponse faite au client chaque fois qu'une demande a été faite pour les contrôleurs de repos dans mon application afin de permettre le partage de ressources Cross Origin Actuellement, j'ajoute manuellement ceci en-tête à chaque méthode comme celle-ci

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

Son fonctionnement mais son très frustrant. J'ai trouvé webContentInterceptor dans les documents de printemps qui nous permettent de modifier les en-têtes sur chaque réponse

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

mais quand j'utilise cela, il renvoie une erreur que la propriété introuvable du nom Access-Control-Allow-Origin est donc là une autre façon, nous pouvons ajouter automatiquement en-tête à chaque réponse

Mise à jour ! Spring Framework 4.2 simplifie considérablement cela en ajoutant une annotation @CrossOrigin à une méthode ou à un contrôleur lui-même https://spring.io/blog/2015/06/08/cors-support-in-spring-framework =

38
Mayank Sharma

J'ai récemment abordé ce problème et trouvé cette solution. Vous pouvez utiliser un filtre pour ajouter ces en-têtes:

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);
    }

}

N'oubliez pas d'ajouter le filtre à votre contexte printanier:

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

et le mappage dans le 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>

Pour aller un peu plus loin, vous pouvez spécifier un profil Spring pour activer ou désactiver ce filtre avec quelque chose comme ça:

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

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

(fournissant le FilterChainDoFilter similaire au CorsFilter mais qui ne fait que filterChain.doFilter(request, response); dans le doFilterInternal (..))

57
Dayde

Mise à jour ! Spring Framework 4.2 simplifie considérablement cela en ajoutant une annotation @CrossOrigin à une méthode ou à un contrôleur lui-même https://spring.io/blog/2015/06/08/cors-support-in-spring-framework =

15
Mayank Sharma

Si vous souhaitez définir des en-têtes pour le contrôleur, vous pouvez utiliser @ModelAttribute annotation.

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

Au printemps 4, vous pouvez utiliser @CrossOrigin () qui vous permet le problème de l'origine croisée.

Pour des raisons de sécurité, les navigateurs interdisent les appels AJAX aux ressources résidant en dehors de l'origine actuelle. Par exemple, lorsque vous vérifiez votre compte bancaire dans un onglet, vous pouvez avoir le site Internet evil.com dans un autre Les scripts de evil.com ne devraient pas pouvoir faire AJAX requêtes à votre API bancaire (retirer de l'argent de votre compte!) en utilisant vos identifiants.

Le partage de ressources entre origines (CORS) est une spécification W3C implémentée par la plupart des navigateurs qui vous permet de spécifier de manière flexible quel type de demandes interdomaines est autorisé, au lieu d'utiliser des hacks moins sécurisés et moins puissants comme IFrame ou JSONP.

Spring Framework 4.2 GA fournit un support de première classe pour CORS prêt à l'emploi, vous offrant un moyen plus simple et plus puissant de le configurer que les solutions classiques basées sur des filtres.

Vous pouvez ajouter une annotation @CrossOrigin à votre méthode de gestionnaire annoté @RequestMapping afin d'activer CORS dessus. Par défaut, @CrossOrigin autorise toutes les origines et les méthodes HTTP spécifiées dans l'annotation @RequestMapping:

@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 n'a pas de propriété nommée Access-Control-Allow-Origin, et pour autant que je puisse voir, il n'expose aucune méthode pour définir les en-têtes de réponse. Il définit uniquement certains en-têtes liés au cache en activant/désactivant certaines propriétés. Mais il est trivial d'écrire votre propre intercepteur (ou filtre de servlet) qui fait cela.

0
NilsH

Je suis également confronté à ce problème et j'ai ajouté ce problème de code corrigé.

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