2015-04-18 9 views
7

Ho un requisito in base al quale un valore non deve essere memorizzato nella cache nel server né il browser come cookie su domini e sessioni.BHSM-Servlet non consente al nome utente cache del browser

Così ho scelto di permanente redirect al valore

Servlet:

@Override 
protected void service(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 
    String key = request.getParameter("key"); 
    String val = request.getContentType(); 
    if (val != null && val.length() == 0) { 
     val = null; 
    } 
    String repeatText = request.getParameter("repeatText"); 
    if (val != null && repeatText == null) { 
     response.setStatus(301); // moved permanent 
     response.addHeader("Location", "?repeatText=" + val); 
     System.out.println("Write"); 
    } else { 
     if (repeatText != null) { 
      response.setContentLength(repeatText.length()); 
      response.addHeader("pragma", "no-cache"); 
      response.addIntHeader("expires", BROWSER_CACHE_DAYS); 
      response.getWriter().write(repeatText); 
      System.out.println("Read and cache!"); 
     } else { 
      response.sendError(304); // use from cache! 
      System.out.println("Send use from cache."); 
     } 
    } 
} 

Script:

<input class="username" /> 
<button>Login</button> 

<script> 
jQuery.ajax('theservlet?key=username').done(function(v){jQuery('.username').val(v);}); 
jQuery('button').click(function(){ 
    jQuery.ajax('theservlet?key=username',{contentType:jQuery('.username').val()}) 
}); 
</script> 

Console-uscita:

Send use from cache. 
--- i enter username and press the button --- 
Write 
Read and cache! 
--- now i make a reload --- 
Send use from cache. 

Dopo la reaload dal fratello wsercache non restituisce il nome utente inserito.

Perché il browser non memorizza nella cache?

EDIT: Added for explaintaition

+0

che cosa fa la barra degli indirizzi dire prima e dopo la ricarica? – CupawnTae

+0

'http: // localhost: 8080 /' –

+0

btw, che cos'è BHSM? – CupawnTae

risposta

0

La vostra richiesta è una chiamata AJAX che è un async request al vostro servlet in questo caso il reindirizzamento in serverside non influisce al lato client. Questa richiesta funziona come un thread separato nel tuo browser.

Quindi è necessario specificare i dati di risposta (url in questo caso con stringa di query). Dopo la risposta della servlet nella callback con successo ajax, è necessario specificare la posizione per reindirizzare l'evento.

Per il reindirizzamento dopo un successo jax window.location.href = reponseUrl;, invece del reindirizzamento è possibile impostare il valore del proprio input.

Altrimenti basta inviare il modulo e reindirizzare tramite il servlet.

0

Il reindirizzamento della richiesta Ajax non reindirizzerà il browser alla nuova posizione e, in caso contrario, non avresti più la tua pagina, avresti solo la risposta dal servlet.

Quindi, quando si aggiorna la pagina, si richiede di nuovo l'URL originale da zero e il nome utente viene perso.

si potrebbe aggiungere il nome utente nella URL direttamente in JavaScript:

jQuery('button').click(function(){ 
    var username=jQuery('.username').val(); 
    jQuery.ajax('theservlet?key=username',{contentType:username}); 
    window.location.hash=username; 
}); 

Questo aggiungerà "# nome utente" per l'URL nella barra degli indirizzi. E poi il caricamento della pagina è possibile popolare l'ingresso dal parametro di richiesta se presente:

jQuery('.username').val(window.location.hash); 
+0

Non mi piace che il browser cambi la posizione. –

0

Anche se si ottiene il lavoro 301 meccanismo, non avrete alcuna garanzia sulla durata del browser memorizza nella cache il redirect .Non ho una risposta immediata per il motivo per cui i 301 non vengono memorizzati nella cache per te, tuttavia se stai bene con il browser memorizzando il nome utente da qualche parte (dopo tutto, questo è quello che stai cercando di fare con i 301) , ed è solo che in particolare non si vuole che essere immagazzinato in un biscotto, quindi sessionStorage o localStorage sarebbe la scelta giusta:

sessionStorage.setItem("username", username); 

e

var username = sessionStorage.getItem("username"); 

o utilizzare localStorage per memorizzarlo con insistenza acr sessioni di oss.

Docs here

+0

Questi archivi sono limitati a un dominio o sessione. Questo è diverso dal meccanismo BHSM. Mi piace permettere a tutti di condividere queste informazioni su domini, estensioni e plug-in di pagine diverse. –

+0

Ok. Probabilmente vale la pena aggiungere questo requisito alla domanda. – CupawnTae

Problemi correlati