2016-04-01 14 views
0

ich einen Web-Service geschrieben und wird die Anfrage in Form von HttpServletRequest Objekt, i alle Header für grundlegende Validierung dann senden für Blanks oder null usw. wie die Überprüfungentfernen Wert Kopfball nach HttpServletRequest

public void validateHeader(HttpServletRequest request) 
Enumeration<String> headerNames = request.getHeaderNames(); 
    while (headerNames.hasMoreElements()) { 
     String key = (String) headerNames.nextElement(); 
     String value = request.getHeader(key);   
     genericHeaderValidator(key, value);   
    } 
} 

Wie Sie sehen können, gibt die request.getHeaderNames();Enumeration<String> zurück.
Aber in einigen Webservices möchte ich die Validierung überspringen, da der obige Code in einer anderen Klasse geschrieben ist, ich möchte sie intakt halten und möchte, dass die Änderung auf Anruferseite erfolgt.

Zum Beispiel
wenn ich will Validierung von Header überspringen, so genannten „Content-Type“, wenn i request.removeAttribute("content-type"); tue es nicht das Header-Attribut entfernen, so ging ich weiter und dachte, es von Enumeration<String> headerNames Aber enumeration doesn't allow us to remove any element zu entfernen.
Hat jemand eine Idee, wie Sie ein Element aus den Header-Parametern HttpServletRequest Object entfernen können.

Antwort

0

Attribut, Parameter und Header, alle drei sind im Kontext von HttpRequest unterschiedlich. So wird request.removeAttribute("xyz"); ein Attribut mit dem Namen xyz in der Anfrage nicht die Kopfzeile entfernen. Soweit ich weiß, können Sie Header nicht einfach so entfernen oder ändern.

Im Folgenden sind die verschiedenen Möglichkeiten, die ich denken könnte, um den Zweck zu dienen.

Option 1: Wenn die Header

while (headerNames.hasMoreElements()) { 
     String key = (String) headerNames.nextElement(); 
     if(!key.equals("content-type") { 
      String value = request.getHeader(key);   
      genericHeaderValidator(key, value);   
     } 
    } 
} 

Option 2 konstant zu ignorieren ist: Wenn Header für die Validierung durch den Anrufer (Ihrem Fall) bestimmt werden ignoriert. Übergeben Sie den Satz von Headern, die nicht wie diese validiert werden:

public void validateHeader(HttpServletRequest request, Set<String> headersToBeIgnored) { 

     Enumeration<String> headerNames = request.getHeaderNames(); 
     while (headerNames.hasMoreElements()) { 
      String key = (String) headerNames.nextElement(); 
      if(!headersToBeIgnored.contains(key){ 
       String value = request.getHeader(key);   
       genericHeaderValidator(key, value);   
      } 
     } 
} 

So, hier Sie den Satz von Headern von der Anrufer Seite passieren kann, die nicht validiert werden. Und während Sie die Header durchlaufen, prüfen Sie einfach, ob der Header in headersToBeIgnored enthalten ist, und validieren Sie ihn nicht.

Option 3: Erweitern HttpServletRequestWrapper

Wie Sie sagten, dass Sie die Header von Anruferseite, die akzeptierte Antwort hier (Adding an HTTP Header to the request in a servlet filter) dient genau Ihren Zweck entfernen müssen. Sie können HttpServletRequestWrapper erweitern und getHeaderNames(); überschreiben, in dem Sie eine andere Enumeration mit nur erforderlichen Kopfzeilen zurückgeben können.

Für jede andere Gruppe von Kopfzeilen, die von einem anderen Aufrufer zurückgegeben werden, müssen Sie jedoch eine separate Implementierung haben. Also, das sollte in Ordnung sein, wenn Sie nicht zu viele verschiedene Anrufer haben.

In der obigen Antwort müssen Sie entfernen statt hinzufügen.

+0

Nein eigentlich für nur einige Anrufer Ich möchte die Validierung überspringen, daher habe ich den Weg, um den Header von der Anruferseite zu entfernen, ich denke, ich muss eine Klasse mit 'Adapter' Muster schreiben, wo' Iterator' sein kann a ** target ** und 'Enumeration' sollen ** Adaptee ** sein –

Verwandte Themen