2017-06-30 3 views
0

Ich entwickle eine Rest-App mit Java/Jersey und ich habe einige Probleme mit dem Verhalten der App.Java/Jersey läuft alle meine Ressourcen, bevor Sie irgendwelche Maßnahmen ergreifen

Die Sache ist ... Ich habe einen Ordner, wo ich meine Ressourcen und sie erweitern eine Elternklasse namens API, die Token-basierte Authentifizierung durchführt.

Das Problem besteht darin, dass beim Zugriff auf einen beliebigen Anwendungsendpunkt die Validierungsmethode in der übergeordneten Klasse mehrmals ausgeführt wird, bevor auf meine Modelle zugegriffen wird. Kann mir jemand sagen, warum das passiert?

My Parent Klasse Api

@Provider 
public class Api extends GensonContextResolver implements ContainerRequestFilter { 

    @Context 
    private UriInfo info; 

    public static final String AUTHENTICATION_TOKEN = "token"; 

    protected ObjectResponse objectResponse; 
    protected UsuariosModel userInfo; 

    public Api() { 

    } 

    @Override 
    public void filter(ContainerRequestContext containerRequest) throws WebApplicationException { 

     this.objectResponse = new ObjectResponse(); 
     this.userInfo = new UsuariosModel(); 

     UriInfo info = containerRequest.getUriInfo(); 

     // não realiza a valização se o endpoint for o de validação de acesso 
     if(info.getPath().equals("autenticacao/valida-acesso")) { 
      return; 
     } 

     try { 

      String token = containerRequest.getHeaderString(AUTHENTICATION_TOKEN); 

      AutenticacaoController autenticacaoControler = new AutenticacaoController(); 
      this.objectResponse = autenticacaoControler.validaToken(token); 

      UsuariosController usuariosController = new UsuariosController(); 
      this.userInfo = usuariosController.selecionaDadosUsuario(token); 


     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (NamingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     if (this.objectResponse.getMessage() != null) { 
      Response response = Response.status(this.objectResponse.getCode()).entity(this.objectResponse).build(); 
      containerRequest.abortWith(response); 
     } 

    } 
} 

Ressourcen Beispiel

@Path("/descontos") 
public class DescontosResource extends Api{ 

    public DescontosResource() { 

    } 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response doGet() throws SQLException, NamingException { 
     DescontosController descontosController = new DescontosController(); 
     this.objectResponse = descontosController.selecionaDescontos(); 
     return Response.status(this.objectResponse.getCode()).entity(this.objectResponse).build(); 
    } 

    @POST 
    @Path("clientes") 
    @Produces(MediaType.APPLICATION_JSON) 
    @Consumes(MediaType.APPLICATION_JSON) 
    public Response doPostClientes(DescontosModel descontos) throws SQLException, NamingException { 
     DescontosController descontosController = new DescontosController(); 
     this.objectResponse = descontosController.cadastraDescontosClientes(descontos); 
     return Response.status(this.objectResponse.getCode()).entity(this.objectResponse).build(); 
    } 
} 

Antwort

0

fand ich die Antwort auf diese beiden Links:

Best practice for REST token-based authentication with JAX-RS and Jersey

und

Jersey ContainerRequestFilter not triggered

Ich habe meinen Code aus der Api-Klasse und bewegte, um die Filter zu anderem Ort entfernen. Und schließlich aktualisiert meine web.xml zu:

<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>com.sib.resources; com.sib.filters</param-value> 
    </init-param> 
    <init-param> 
     <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name> 
     <param-value>com.sib.filters.AutenticacaoFilter</param-value> 
    </init-param> 
Verwandte Themen