5

Tôi có một trang servlet và một trang HTML. Làm cách nào để ngăn người dùng nhấn nút quay lại của trình duyệt sau khi đăng xuất? Tôi đã đọc cùng một câu hỏi trong stackoverflow, nhưng câu trả lời đang sử dụng lịch sử trình duyệt vô hiệu hóa với java script hoặc sử dụng trang - không có bộ nhớ cache trong tiêu đề http. Làm thế nào chúng ta có thể thực hiện nó bằng cách sử dụng các servlet ngăn cản hành động quay trở lại, bộ nhớ cache http-header không có gì vô dụng khi Firefox nói trang đã hết hạn khi nó được làm mới hai lần nữa, trang bảo mật được hiển thị.phiên servlet, sau khi đăng xuất, khi nút quay lại của trình duyệt được nhấn, một lần nữa trang bảo mật được hiển thị

Tôi đã thực hiện theo cách, phương pháp mẫu chỉ để thử (không thực) Tên người dùng và mật khẩu của tôi được đăng lên servlet từ trang HTML servlet lưu trữ trong phiên nếu mật khẩu và tên người dùng là chính xác. Khi trang an toàn được yêu cầu, nếu phiên tồn tại trang bảo mật được hiển thị và id nhật ký người dùng từ phiên, trang đăng nhập hiển thị tất cả đang hoạt động ngoại trừ việc đăng xuất không thành công nếu người dùng truy cập lại nút của trình duyệt.

Làm cách nào để ngăn chặn servlet bảo mật hiển thị nội dung sau khi đăng xuất và sau đó nhấn nút quay lại trong trình duyệt?

src của 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 của servlet

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; 
    }  

} 

Trả lời

8

lọc của bạn là thiết lập các tiêu đề no-cache trên welcome.html chỉ, không phải trên các trang bị hạn chế. Vì vậy, bất cứ khi nào trình duyệt yêu cầu bất kỳ trang bị hạn chế nào qua nút quay lại, nó có thể sẽ hiển thị phiên bản được lưu trong bộ nhớ cache. Bộ lọc của bạn cần đặt tiêu đề không có bộ nhớ cache trên tất cả các trang bị hạn chế.

Vì vậy, bạn cần phải thay đổi

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); 
    } 

để

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

tôi nghĩ rằng chaining là cần thiết !! – cc4re

Các vấn đề liên quan