2017-06-30 31 views
0

我正在開發一個Java/Jersey的休息應用程序,並且我在應用程序的行爲中遇到了一些問題。Java/Jersey在執行任何操作之前運行我的所有資源

事情是......我有一個文件夾,我把我的資源,他們擴展名爲API的父類,執行基於令牌的身份驗證。

問題是,當我訪問任何應用程序端點時,在訪問我的模型之前,父類中的驗證方法會運行多次。 有誰能告訴我爲什麼會發生這種情況?

我的父類的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); 
     } 

    } 
} 

資源例如

@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(); 
    } 
} 

回答

0

我發現這兩個鏈接的答案:

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

Jersey ContainerRequestFilter not triggered

我已經刪除從API類我的代碼和移動過濾器別的地方。最後更新我的web.xml到:

<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> 
相關問題