2017-10-03 3 views
1

J'ai créé un serveur Grizzly qui renvoie JSON. Il fonctionne très bien:Comment ajouter des filtres au serveur Grizzly?

final ResourceConfig resourceConfig = new ResourceConfig().packages("com.mypackage"); 
    resourceConfig.setApplicationName("My-Service"); 
    resourceConfig.register(JacksonJaxbJsonProvider.class); 
    server = GrizzlyHttpServerFactory.createHttpServer(uri, resourceConfig); 

J'ai besoin filtres que

  • Vérifiez si l'en-tête d'autorisation contient une clé valide
  • Réagit avec 302/redirect si x-forwarded-proto est http (avec un emplacement défini sur la (https équivalent)
  • Répond avec 403/interdit si x-forwarded-for n'est pas sur la liste blanche

En ce moment je fais ces contrôles comme ceci:

@Path ("v1") public class Façade {

@GET 
@Path("/getinfo/{infotype}") 
@Produces(MediaType.APPLICATION_JSON) 
public Response getNextPwc(@HeaderParam("authorization") String authorizationKey, 
     @Context Request request, 
     @HeaderParam("x-forwarded-proto") String xForwardedProto, 
     @HeaderParam("x-forwarded-for") String xForwardedFor, 
     @PathParam("infotype") String infoType) { 
    Response errorResponse = getErrorResponse(authorizationKey, request, xForwardedFor, xForwardedProto); 
    if (errorResponse != null) { 
     return errorResponse; 
    } 
    ... start work with infoType here ... 

Il fonctionne - le serveur se comporte correctement - mais le code est en le mauvais endroit (et je dois me rappeler de l'ajouter à toutes les nouvelles méthodes) donc je voudrais le déplacer à un mécanisme de filtre à la place.

Toute aide est très appréciée.

(Je sais que les x-forwarded-proto et x-forwarded-for chèques ne sont pas preuve de balle, mais il vaut mieux que rien.)

Répondre

0

mise à jour: cela fonctionne, bien qu'il soit sans doute pas comment il était censé être mis en place:

final HttpServer server = new HttpServer(); 

final NetworkListener networkListener = new NetworkListener(
    "secured-listener", 
    "0.0.0.0", 
    9191 
); 
server.addListener(networkListener); 
server.start(); 

networkListener.getFilterChain().add(5, new BaseFilter(){ 
    @Override 
    public NextAction handleRead(FilterChainContext ctx) throws IOException { 
     return super.handleRead(ctx); 
    } 
}); 
System.in.read(); 

indice de l'avis getFilterChain() add (-..! le filtre doit être avant HttpServerFilter car il retourne l'action ARRÊT

+0

Intéressant, je vais essayer ce Mais comment sont « votre » 'transport' et "mon" 'serve r' connecté? –

+0

Merci pour la mise à jour! Maintenant, je commence à comprendre. –