Bonsoir,
J'essaie tant bien que mal de faire interagir mon api rest développé avec Spring/Spring Security et mon application client développé avec angular.
Lorsqu'ils sont sur le même serveur, ces deux applications fonctionnent parfaitement. Lorsqu'elles sont sur des serveurs différents, j'ai une infinité de problème lié au CORS.
Chaque fois que je résous un problème, un autre se créé, ce qui fait que mon CORS ne fonctionne pas du tout correctement. Pour certaines requêtes ça marche, pour d'autre ça ne marche pas...
Le problème, c'est que je dois envoyer un header particulier à chaque requête, header qui contient un token identifiant l'utilisateur. Parfois cet header est envoyé, parfois non!
Exemple: le header est envoyé à l'appel de la requête /login en post, qui identifie l'utilisateur (cette ressource n'est pas protégée!). Il ne l'ajoute pas quand il s'agit de certaines ressources protégées, comme /quote/create en post, qui attend un objet de type Quote en paramètre. Là, le header n'est pas ajouté!
Voilà comment j'ai fait pour ajouter ce Token à chaque requête :
Voici mon filtre CORS:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 angular.module("quoteApp").factory("httpResponseInterceptor", [ "$q", "$location", "$cookieStore", function($q, $location, $cookieStore) { return{ request: function(config) { var token = $cookieStore.get("token"); if (token && token.key) { config.headers["X-Auth-Token"] = token.key; } return config || $q.when(config); }, 'requestError': function(rejection) { return $q.reject(rejection); }, // other stuff
Code:
1
2
3
4
5
6
7
8
9
10 @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { //This is not even printing HttpServletResponse response = (HttpServletResponse) res; response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "Accept, X-Auth-Token, Content-Type"); chain.doFilter(req, res); }
Dans ma configuration Spring, j'ai tout essayé. J'ajoute mon filtre ici, dans mon WebInitializer:
Code:
1
2
3
4
5
6
7
8
9
10
11 @Override protected Filter[] getServletFilters() { CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); characterEncodingFilter.setEncoding(ENCODING_UTF8); characterEncodingFilter.setForceEncoding(true); return asPrimitiveArray( characterEncodingFilter, new SimpleCORSFilter(), new DelegatingFilterProxy("springSecurityFilterChain"), new OpenEntityManagerInViewFilter()); }
Le problème, c'est qu'angular n'envoit pas le header pour certaines requêtes!
Remote Address:::1:8080 Request URL:http://localhost:8080/quote/quote/create Request Method:OPTIONS Status Code:401 Non-Autorisé Request Headersview source Accept:*/* Accept-Encoding:gzip,deflate,sdch Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 Access-Control-Request-Headers:accept, x-auth-token, content-type Access-Control-Request-Method:POST Cache-Control:no-cache Connection:keep-alive Host:localhost:8080 Origin:http://localhost:9000 Pragma:no-cache Referer:http://localhost:9000/ User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36 Response Headersview source Access-Control-Allow-Headers:Accept, X-Auth-Token, Content-Type Access-Control-Allow-Methods:POST, GET, OPTIONS, DELETE Access-Control-Allow-Origin:* Access-Control-Max-Age:3600 Cache-Control:no-cache, no-store, max-age=0, must-revalidate Date:Sat, 19 Jul 2014 18:01:19 GMT Expires:0 Pragma:no-cache Server:Apache-Coyote/1.1 Transfer-Encoding:chunked X-Content-Type-Options:nosniff X-Frame-Options:DENY X-XSS-Protection:1; mode=block
Je ne comprends vraiment pas pourquoi. Merci pour votre aide.