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-framework6 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(..))
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
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");
}
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
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.
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;
}
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