5

Mam serwlet i stronę HTML. Jak mogę uniemożliwić użytkownikowi naciśnięcie przycisku Wstecz w przeglądarce po wylogowaniu? Czytałem to samo pytanie w stackoverflow, ale odpowiedzi używają historii przeglądarki wyłączonej za pomocą skryptu java lub używania strony - brak pamięci podręcznej w nagłówkach HTTP. W jaki sposób możemy go zaimplementować za pomocą serwletów, które uniemożliwiają cofnięcie działania, nagłówek http bez bufora jest bezużyteczny, ponieważ Firefox mówi, że strona wygasła, gdy jest odświeżana dwa razy, ponownie wyświetlana jest bezpieczna strona.sesja serwletów, po wylogowaniu, po naciśnięciu przycisku Wstecz przeglądarki ponownie wyświetlana jest bezpieczna strona

Zrobiłem w pewnym sensie próbkę metody tylko na próbę (nie rzeczywistą) Moja nazwa użytkownika i hasło są wysyłane do serwletu ze strony HTML, którą serwlet przechowuje w sesji, jeśli hasło i nazwa użytkownika są poprawne. Gdy ponownie żądana jest bezpieczna strona, jeśli sesja istnieje, wyświetlana jest bezpieczna strona i identyfikator użytkownika wylogowuje się z sesji, gdy wyświetlana jest strona logowania, z wyjątkiem sytuacji, gdy wylogowanie się nie powiedzie, jeśli użytkownik kliknie przycisk przeglądarki.

W jaki sposób możemy zapobiec wyświetlaniu zawartości przez bezpieczny serwlet po wylogowaniu, a następnie naciśnięciu przycisku Wstecz w przeglądarce?

src od welcome.html

<html> 
<body> 

<form method="POST" action="Sessionexample"> 
<div align="center"> 
<table border="1" style="border-collapse: collapse"> 
    <tr> 
     <td>Username</td> 
     <td><input type="text" name="username" size="20"></td> 
    </tr> 
    <tr> 
     <td>Password</td> 
     <td><input type="text" name="password" size="20"></td> 
    </tr> 
    <tr> 
     <td height="24">&nbsp;</td> 
     <td height="24">&nbsp;</td> 
    </tr> 
    <tr> 
     <td>&nbsp;</td> 
     <td><input type="submit" value="Submit" name="B1"></td> 
    </tr> 
</table> 
</div> 
</form> 
</body> 
</html> 

src od serwletu

public class Sessionexample extends HttpServlet implements Servlet , Filter { 
    private static final long serialVersionUID = 1L; 
    public String username =null, password=null; 
    public HttpSession session ; 
    public PrintWriter pw; 
    int do_get =0 ; 
    /** 
    * Default constructor. 
    */ 


    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 

     HttpSession session = request.getSession(false);   
     if (session == null || session.getAttribute("username") == null) { 
      response.sendRedirect("welcome.html"); // No logged-in user found, so redirect to login page. 
      response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
      response.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
      response.setDateHeader("Expires", 0); 
     } else { 
      chain.doFilter(req, res); 
     } 
    } 


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    { 

     do_get=1; 
     pw = response.getWriter(); 
     session=request.getSession(false); 
     try 
     { 
      if(request.getParameter("action")!=null) 
      { 
       if(request.getParameter("action").equals("logout")) 
       { 

        session = request.getSession(true); 
        session.setAttribute("username", ""); 
        session.setAttribute("password", ""); 
        session.invalidate(); 
        response.sendRedirect("welcome.html"); 
        return; 
       } 
      } 
      else 
      if(session !=null) 
       { 
       if((String)session.getAttribute(username)!=null) 
       username = (String)session.getAttribute("username").toString(); 
       if((String)session.getAttribute("password") !=null) 
       password =session.getAttribute("password").toString(); 
       pw.write("not new-"); 
       serviced(request,response); 
       } 

     } 
     catch(Exception ex) 
     { 
      pw.write("Error-"+ex.getMessage()); 
     } 

    } 

    /** 
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    { 

     if(request.getParameter("username")!=null && request.getParameter("password")!=null) 
     { 
      username = request.getParameter("username").toString(); 
      password = request.getParameter("password").toString(); 
     } 

     serviced(request,response); 

    } 


    protected void serviced(HttpServletRequest request, HttpServletResponse response) throws IOException 
    { 

      response.setContentType("text/html"); 

      pw = response.getWriter(); 
     if(username !=null && password !=null) 
      if(username.equals("admin") && password.equals("a")) 
      { 

       try 
       { 

        if(do_get==0) 
        { 
       session = request.getSession(true); 
       session.setAttribute("username", "admin"); 
       session.setAttribute("password", "a"); 
        }    
       pw.write("You are logged in : "+username+" <br/> "+"<a href='?action=logout'><h1> Logout </h1> </a>"); 

       } 
       catch(Exception ex) 
       { 
             response.sendRedirect("welcome.html"); 

       } 

      } 
      else 
      { 
      response.sendRedirect("welcome.html"); 
      } 
      else 
       response.sendRedirect("welcome.html"); 
    } 

    @Override 
    public boolean accept(Object arg0) throws IOException { 
     // TODO Auto-generated method stub 
     return false; 
    }  

} 

Odpowiedz

8

Twój filtr jest ustawienie nagłówki no-cache na welcome.html tylko, a nie zastrzeżonych stron. Tak więc za każdym razem, gdy przeglądarka zażąda któregokolwiek z tych zastrzeżonych stron za pomocą przycisku Wstecz, najprawdopodobniej pojawi się wersja z pamięci podręcznej. Twój filtr musi ustawić nagłówki bez pamięci podręcznej na wszystkich ograniczonych stronach.

Więc trzeba zmienić

if (session == null || session.getAttribute("username") == null) { 
     response.sendRedirect("welcome.html"); // No logged-in user found, so redirect to login page. 
     response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
     response.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
     response.setDateHeader("Expires", 0); 
    } else { 
     chain.doFilter(req, res); 
    } 

do

if (session == null || session.getAttribute("username") == null) { 
     response.sendRedirect("welcome.html"); // No logged-in user found, so redirect to login page. 
    } else { 
     response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
     response.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
     response.setDateHeader("Expires", 0); 
     chain.doFilter(req, res); 
    } 
+0

myślę łańcuchowym jest potrzebne !! – cc4re

Powiązane problemy