automatycznie dodawaj nagłówek do każdej odpowiedzi

Chcę dodać ten nagłówek "Access-Control-Allow-Origin", " * " do każdej odpowiedzi udzielonej klientowi za każdym razem, gdy żądanie zostało złożone dla kontrolerów rest w mojej aplikacji, aby umożliwić współdzielenie zasobów cross origin obecnie ręcznie dodaję ten nagłówek do każdej metody, takiej jak Ta

HttpHeaders headers = new HttpHeaders();
headers.add("Access-Control-Allow-Origin", "*");
To działa, ale jest bardzo frustrujące . Znalazłem webContentInterceptor w dokumentach spring, które pozwalają nam modyfikować nagłówki każdej odpowiedzi
<mvc:interceptors>
<bean id="webContentInterceptor" 
class="org.springframework.web.servlet.mvc.WebContentInterceptor">
<property name="Access-Control-Allow-Origin" value="*"/>
</bean>
</mvc:interceptors>

Ale kiedy używam tego, rzuca błąd ta właściwość nie została znaleziona w name Access-Control-Allow-Origin, więc czy istnieje inny sposób, w jaki możemy automatycznie dodać nagłówek do każdej odpowiedzi

Update ! Spring framework 4.2 znacznie upraszcza to, dodając adnotację @ CrossOrigin do metody lub samego kontrolera https://spring.io/blog/2015/06/08/cors-support-in-spring-framework
Author: BalusC, 2013-04-24

6 answers

Ostatnio zająłem się tym problemem i znalazłem takie rozwiązanie. Możesz użyć filtra, aby dodać te nagłówki:

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

}

Nie zapomnij dodać filtra do kontekstu wiosennego:

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

I mapowanie w sieci.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>

Aby przejść nieco dalej, możesz określić profil sprężyny, aby włączyć lub wyłączyć ten filtr za pomocą czegoś takiego:

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

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

(zapewniając Filtr podobny do filtra Korsowego, ale który działa tylko filterChain.doFilter(request, response); w doFilterInternal(..))

 55
Author: Dayde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-24 12:13:57

Update ! Spring Framework 4.2 znacznie to upraszcza, dodając adnotację @ CrossOrigin do metody lub samego kontrolera https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

 14
Author: Mayank Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-07 14:45:58

Jeśli chcesz ustawić nagłówki dla kontrolera, możesz użyć adnotacji @ModelAttribute.

@ModelAttribute
public void setVaryResponseHeader(HttpServletResponse response) {
    response.setHeader("Vary", "Accept");
}    
 5
Author: Andrei N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-23 19:56:49

W Spring 4 możesz użyć @ CrossOrigin() co pozwala na problem z pochodzeniem krzyżowym.

Ze względów bezpieczeństwa przeglądarki zabraniają wywoływania AJAX do zasobów znajdujących się poza bieżącym źródłem. Na przykład, gdy sprawdzasz swoje konto bankowe w jednej zakładce, możesz mieć evil.com strona w innej zakładce. Skrypty z evil.com nie powinno być w stanie wykonywać żądań AJAX do API banku (wypłacanie pieniędzy z konta!) z wykorzystaniem Twoich danych uwierzytelniających.

Cross-origin współdzielenie zasobów (CORS) jest specyfikacją W3C zaimplementowaną przez większość przeglądarek, która pozwala w elastyczny sposób określić, jakiego rodzaju żądania cross domain są autoryzowane, zamiast używać mniej zabezpieczonych i mniej wydajnych hacków, takich jak IFrame lub JSONP.

Spring Framework 4.2 ga zapewnia pierwszorzędne wsparcie dla CORS po wyjęciu z pudełka, dając łatwiejszy i bardziej wydajny sposób konfiguracji niż typowe rozwiązania oparte na filtrach.

Możesz dodać adnotację @ CrossOrigin do swojego @RequestMapping adnotated handler method in to enable CORS on it. Domyślnie @CrossOrigin zezwala na wszystkie źródła i metody HTTP określone w adnotacji @ 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
Author: Sudhakar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-24 13:03:49

WebContentInterceptor nie posiada właściwości o nazwie Access-Control-Allow-Origin i z tego co widzę, nie ujawnia żadnych metod ustawiania nagłówków odpowiedzi. Ustawia tylko niektóre nagłówki związane z pamięcią podręczną, włączając / wyłączając niektóre właściwości. Ale to trywialne napisać swój własny interceptor (lub filtr servlet), który to robi.

 0
Author: NilsH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-24 11:29:56

Jestem również twarzą w twarz z tym problemem i dodałem ten problem z kodem naprawiony.

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
Author: Poocholamannan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-31 08:36:21