Über einen filter hinzufügen, wird ein cookie auf dem Benutzer-Sitzung
Update: Das Problem mit der Einstellung für die MaxAge. Eine Einstellung von null führen wird das cookie gelöscht werden, daher war es angezeigt, in den header der Antwort, wurde dann aber gelöscht und nicht zeigen, dass in der Anfrage. Eine Einstellung von -1, so dass es wird nicht persistent gespeichert
Ich mache einige Arbeit auf einem filter, in dem ich will, dass es ein cookie gesetzt, um anzuzeigen, dass der Benutzer qualifiziert, die an der Umfrage teilnehmen und das nächste mal kommt er zurück auf die Website ein Umfrage-popup-Fenster wird angezeigt.
Ich bin nicht zu sehen, keine Fehler in den logs, aber das cookie wird nie gesetzt.
Kann ein filter verwendet werden, das hinzufügen ein cookie? Gibt es wo eine HttpServletResponseWrapper ins Spiel kommt?
Der Gedanke hier ist, dass, wenn der Benutzer kommt auf die Seite es wird überprüft, um zu sehen, ob das cookie vorhanden ist. Wenn es nicht ist, dann ein cookie erstellt und Hinzugefügt, um die Reaktion. Wie navigiert der Anwender der Webseite, die cookie-check-Methode wird aufgerufen, um sicherzustellen, dass der hit-counter nicht erhöht wird für diesen bestimmten Benutzer.
Den cookie-check-Methode sieht nie die cookie. Mit web-developer plugin für firefox, das cookie in Frage, ist nicht vorhanden.
Unten ist der filter Klasse mit den entsprechenden Methoden.
public class HitCounterFilter extends TemplateFilter {
public void doMainProcessing(ServletRequest pRequest, ServletResponse pResponse, FilterChain pChain) {
HttpServletRequest httpRequest = (HttpServletRequest) pRequest;
HttpServletResponse httpResponse = (HttpServletResponse) pResponse;
//prevent thread interference and memory consistency errors
synchronized (lock) {
int hitCounter = this.readFile(localFile);
//if user has not been counted
if (!this.checkForCookie(httpRequest, "gtgo_visitor")) {
this.writeFile(localFile, ++hitCounter);
this.createCookie(httpRequest, httpResponse, String.valueOf(hitCounter), "gtgo_visitor");
}
}
}
private void createCookie(HttpServletRequest pHttpRequest, HttpServletResponse pHttpResponse, String pCookieValue, String pCookieName) {
try {
Cookie cookie = new Cookie(pCookieName, pCookieValue);
URL url = new URL(pHttpRequest.getRequestURL().toString());
cookie.setDomain(url.getHost());
cookie.setPath(this.getCookiePath(pHttpRequest));
cookie.setComment("user is not eligible to take the survey this time");
cookie.setMaxAge(0);
pHttpResponse.addCookie(cookie);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
private boolean checkForCookie(HttpServletRequest pHttpRequest, String pCookieName) {
for (Cookie cookie : pHttpRequest.getCookies()) {
if (StringUtils.equalsIgnoreCase(cookie.getName(), pCookieName)) {
return true;
}
}
return false;
}
}
Haben Sie die änderungen - hoffentlich ist es klarer.
InformationsquelleAutor boyd4715 | 2011-10-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Problem mit der Einstellung für die MaxAge. Eine Einstellung von null führen wird das cookie gelöscht werden, daher war es angezeigt, in den header der Antwort, wurde dann aber gelöscht und nicht zeigen, dass in der Anfrage. Eine Einstellung von -1, so dass es wird nicht persistent gespeichert - es werden anwesend sein, wie lange die Sitzung aktiv ist (die entfernt werden, sobald die session geschlossen wird)
InformationsquelleAutor boyd4715
Habe ich noch nicht gearbeitet, mit dem SCAM-Projekt vor, aber es sieht aus wie das ist, was Sie verwenden. Ich bin mir nicht sicher, ob der super-Klasse ist die Implementierung von doFilter fordert Ihre Umsetzung ist doMainProcessing-Methode vor dem Aufruf der FilterChain der doFilter Methode oder nicht.
Da das framework übergibt die FilterChain in Ihre doMainProcessing Methode, ist es wahrscheinlich, dass es erwartet, dass Ihre Implementierung wird der Aufruf pChain.doFilter(pRequest, pResponse, pChain).
Ich mag mich irren über diese, aber wenn der filter-Kette abgebrochen wird, ist es möglich, dass die Header geschrieben das ServletResponse-Objekt, das das cookie, die Sie angebracht haben, werden nicht an den client zurückgegeben.
In jedem Fall, es sei denn, Sie sind speziell sperren Sie den Zugriff auf die angeforderte Ressource, seine klug zur übertragung der Anforderung über die FilterChain.
Wenn Sie sagte, "Mit web-developer plugin für firefox, das cookie in Frage, ist nicht vorhanden." Meinst du, dass du die Prüfung nachfolgende Anfrage oder der Antwort-Header aus der Anfrage, sollte es eingestellt habe?
Mit dem gleichen plugin für firfox, den ich ausgewählt habe, anzeigen, response-header, und ich sehe die folgenden: Set-Cookie: gtgo_visitor=30; Domain=localhost; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/keurig, So bedeutet dies in der Tat so Aussehen, als ob das cookie gesetzt wurde in der Antwort. Die Frage ist nun also, wie kann ich darauf zugreifen - es erscheint nicht in der HttpServletRequest#getCookies
Ah, ich wünschte, ich hätte gesehen, Ihre Antwort, bevor Sie die Aktualisierung meiner Antwort. Das cookie wird richtig gesetzt. Also das Problem ist, dass es ist, Inkrementieren die Zähler mit jedem Treffer. Cookies werden nur geliefert werden, Anfragen auf URLs, die mindestens so spezifisch wie der Weg, den Sie eingestellt sind. Wenn Sie möchten, dass ein cookie für die gesamte host, dann einfach den Pfad zu /. Aber das erste, was ich tun würde, führen einige Fehlersuche an den loop-through-Anfrage.getCookies (), nur um zu sehen was da IST. Dies ist wahrscheinlich ein Problem mit der PFAD-Erklärung.
Das Problem ist, dass Ihre cookie abläuft (1970);)
InformationsquelleAutor allingeek