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 :
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 |
Voici mon filtre CORS:
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:
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.
Partager