2017-10-18 5 views
0

Je suis en train de développer un api Spring MVC Rest et c'est une API basée sur un jeton. J'envoie un en-tête X-Token pour chaque requête. J'ai une méthode dont le nom est checkToken. Quand j'envoie un jeton de longueur zéro à cette méthode, le ressort ne répond pas. J'utilise Jetty 9, Spring 4.3.6-RELEASE. Ceci est mon contenu de la méthode CheckToken:Gel du ressort si j'envoie un en-tête de longueur zéro

@RequestMapping(path = "/auth/checkToken", method = RequestMethod.GET) 
public @ResponseBody Object checkToken(HttpServletRequest request) throws InvalidTokenException { 
    ClientUtils.checkValidToken(request, jedisPoolContainer.getJedisPool().getResource()); 

    SuccessResult result = new SuccessResult(); 
    return result; 
} 

Et ClientUtils méthodes de classe:

public static boolean isValidToken(HttpServletRequest request, Jedis jedis) { 
    Token token = ClientUtils.getValidToken(request, jedis); 
    if (token != null) 
     return true; 
    return false; 
} 

public static void checkValidToken(HttpServletRequest request, Jedis jedis) throws InvalidTokenException { 
    logger.debug("ClientUtils.isValidToken(request, jedis): " + ClientUtils.isValidToken(request, jedis)); 

    if (ClientUtils.isValidToken(request, jedis) == false) 
     throw new InvalidTokenException(); 
} 

public static Token getValidToken(HttpServletRequest request, Jedis jedis) { 
    logger.debug("request.getHeader(TOKEN_HTTP_NAME): " + request.getHeader(TOKEN_HTTP_NAME)); 

    if (request.getHeader(TOKEN_HTTP_NAME) == null) 
     return null; 

    if (request.getHeader(TOKEN_HTTP_NAME).length() != 32) 
     return null; 

    String rawTokenData = jedis.hget(JedisPoolContainer.TOKENS, request.getHeader(TOKEN_HTTP_NAME)); 
    if (rawTokenData == null) 
     return null; 

    rawTokenData = rawTokenData.replace("\\", ""); 
    Gson gson = new GsonBuilder().setDateFormat("yyyy-mm-dd HH:mm:ss").create(); 
    Token token = gson.fromJson(rawTokenData, Token.class); 
    if (token.getIpAddress().equals(ClientUtils.getClientIpAddr(request))) 
     return token; 

    return null; 
} 

classe CorsFilter est:

@Override 
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 
     throws IOException, ServletException { 

    HttpServletResponse response = (HttpServletResponse) servletResponse; 
    response.setHeader("Access-Control-Allow-Origin", "*"); 
    response.setHeader("Access-Control-Allow-Credentials", "true"); 
    response.setHeader("Access-Control-Allow-Methods", "PUT, POST, GET, HEAD, OPTIONS"); 
    response.setHeader("Access-Control-Allow-Headers", 
      "Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, X-Token"); 
    filterChain.doFilter(servletRequest, servletResponse); 
} 

Spring ne renvoie aucune réponse quand envoyer « X-jeton : "en-tête avec une longueur nulle. J'arrête la jetée avec CTRL + C rele`vera lancer ces exceptions:

[INFO] Stopped [email protected]{HTTP/1.1,[http/1.1]}{0.0.0.0:8888} 
[INFO] Destroying Spring FrameworkServlet 'mvc-dispatcher' 
INFO (AbstractApplicationContext.java:987) Closing WebApplicationContext for namespace 'mvc-dispatcher-servlet': startup date [Wed Oct 18 21:54:38 EEST 2017]; parent: Root WebApplicationContext 
[INFO] Closing Spring root WebApplicationContext 
INFO (AbstractApplicationContext.java:987) Closing Root WebApplicationContext: startup date [Wed Oct 18 21:54:35 EEST 2017]; root of context hierarchy 
[INFO] Stopped [email protected]{/,file:///home/emir/workspacejava/SpringRestApi/src/main/webapp/,UNAVAILABLE}{file:///home/emir/workspacejava/SpringRestApi/src/main/webapp/} 
[WARNING] 
[WARNING] 
[WARNING] 
[WARNING] 
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:816) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1684) 
    at com.nixarsoft.restapi.CorsFilter.doFilter(CorsFilter.java:31) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1667) 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) 
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1121) 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511) 
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1055) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213) 
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:118) 
    at org.eclipse.jetty.server.Server.handle(Server.java:515) 
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:291) 
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242) 
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:238) 
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95) 
    at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:57) 
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:191) 
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:126) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext 
    at org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:170) 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081) 
    at org.springframework.web.method.ControllerAdviceBean.resolveBean(ControllerAdviceBean.java:146) 
    at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.getExceptionHandlerMethod(ExceptionHandlerExceptionResolver.java:447) 
    at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:362) 
    at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:59) 
    at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:136) 
    at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1207) 
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1030) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:980) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    ... 31 more 
[WARNING] 
[WARNING] 
Caused by: java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext 
    at org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:170) 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081) 
    at org.springframework.web.method.ControllerAdviceBean.resolveBean(ControllerAdviceBean.java:146) 
    at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.getExceptionHandlerMethod(ExceptionHandlerExceptionResolver.java:447) 
    at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:362) 
    at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:59) 
    at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:136) 
    at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1207) 
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1030) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:980) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    ... 31 more 
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:816) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1684) 
    at com.nixarsoft.restapi.CorsFilter.doFilter(CorsFilter.java:31) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1667) 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) 
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1121) 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511) 
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1055) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213) 
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:118) 
    at org.eclipse.jetty.server.Server.handle(Server.java:515) 
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:291) 
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242) 
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:238) 
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95) 
    at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:57) 
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:191) 
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:126) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext 
    at org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:170) 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081) 
    at org.springframework.web.method.ControllerAdviceBean.resolveBean(ControllerAdviceBean.java:146) 
    at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.getExceptionHandlerMethod(ExceptionHandlerExceptionResolver.java:447) 
    at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:362) 
    at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:59) 
    at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:136) 
    at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1207) 
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1030) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:980) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    ... 31 more 
[INFO] Jetty server exiting. 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 31:25 min 
[INFO] Finished at: 2017-10-18T21:56:21+03:00 
[INFO] Final Memory: 50M/684M 
[INFO] ------------------------------------------------------------------------ 
[email protected]:~/workspacejava/SpringRestApi$ 

Là où je fais mal? Comment puis-je gérer ce genre de problèmes? Je ne veux pas arrêter le printemps et ça doit marcher à chaque fois.

+0

de tenter d'améliorer votre code un peu et l'exécuter en mode débogage et de voir lorsque le programme cesse de répondre Dans la méthode checkValidToken:. stocker la valeur de getValidToken dans une variable et connectez-le Valeur de la variable Actuellement, getValidToken interroge 2 fois votre redis et l'une des fois est de ne consigner que la valeur Essayez d'utiliser des espaces réservés pour la chaîne enregistrée si l'enregistreur le permet (ex: logback). L'exception lors de la fermeture du programme est levée car une demande est toujours traitée lorsque vous fermez le programme. –

Répondre

0

J'ai trouvé le problème. Le printemps ne gèle pas. Je suis faux en utilisant Jedis. JedisPool a 8 objets Jedis en premier. J'essaye d'obtenir Jedis du pool avec ceci: pool.getResource().hget("something", "something") Cet objet de Jedis de retour et chaque objet de Jedis A FERMÉ. Si vous ne les fermez pas et essayez d'obtenir une nouvelle ressource Jedis, vous devez attendre car JedisPool ne trouve pas d'objet Jedis gratuit. Ceci est gaspillé mes 2 jours