1. 程式人生 > >利用過濾器實現免登陸功能版本1

利用過濾器實現免登陸功能版本1

1 實現免登陸的思想:
當用戶第一次登入的時候,如果使用者設定了儲存了密碼,就把使用者的資訊 set到cookie檔案裡面
第二次利用過濾器 檢視是否有相應的cookie檔案,如果有執行相應的操作(類似與servlet)
具體的程式碼:
web.xml

  <filter>
  <filter-name>AotoFilter</filter-name>
  <filter-class>Filter.AotoFilter</filter-class>
  </filter>

  <filter-mapping>
  <filter
-name>AotoFilter</filter-name> <url-pattern>/login.jsp</url-pattern> </filter-mapping>

login.jsp 進行登入的頁面

<body>
<form action="${pageContext.request.contextPath}/servlet/loginservlet" method="post">
使用者名稱:<input type="text " name="username"><br>
密碼:<input
type="password" name="password">
<br> 記住密碼:<input type="radio" name="aoto" value="OK"><br> <input type="submit" value="登入"> </form> ${msg } </body>

LoginServlet.java 控制器

public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String
username = request.getParameter("username"); String password = request.getParameter("password"); String aoto = request.getParameter("aoto"); UserService us=new UserService(); User user=us.findUser(username,password); //判斷是否登入成功 if(user!=null){ //cookie儲存的也是key value型別 Cookie cookie = new Cookie("user", user.getUsername()+"&"+user.getPassword()); cookie.setPath("/");//當前應用 可以享用 if(aoto.equals("OK")){如果設定了 記住密碼 cookie.setMaxAge(60*60*24*7);//設定7天有效 } response.addCookie(cookie);//把cookie物件儲存到客戶端 request.setAttribute("user", user); request.getRequestDispatcher("/home.jsp").forward(request, response); }else{ request.setAttribute("msg", "使用者名稱或密碼錯誤,請重新登入"); //重新登入 request.getRequestDispatcher("/login.jsp").forward(request, response); } }

AotoFilter 過濾器 其實執行的程式和 servlet差不多

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain filterchain) throws IOException, ServletException {
        //1 轉換兩個物件HttpServletRequest,HttpServletResponse
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        //2 處理業務邏輯
          Cookie[] cookies = req.getCookies();  //得到帶過來的cookie
          //使用者請求是帶著 客戶端裡面的cookie檔案的
          String username=null;
          String password=null;
          //遍歷需要的cookie檔案
          for(int i=0;cookies!=null&&i<cookies.length;i++){
              if("user".equals(cookies[i].getName())){
                  String[] strings = cookies[i].getValue().split("&");
                  username=strings[0];
                  password=strings[1];
              }
          }
          //進行和servlet一樣的操作 
            UserService us=new UserService();
            User user=us.findUser(username, password);
            if(user!=null){
                req.getSession().setAttribute("user", user);
                request.getRequestDispatcher("/home.jsp").forward(request, response);
            }
            //3放行
            filterchain.doFilter(request, response);
    }

對於 請求轉發 和重定向的一些說明:
說明:
1 請求重定向的 路徑規則 response.sendRedirect(“/AotoLogin/home.jsp”);規則: /專案名字/資源名字
2 請求重定向中 session裡面set的東西 可以取出來,requestset的東西取不出,因為 request只是對一次請求內有效 ,也就是說 只要位址列 不變化 就可以有效,重定向 發生了位址列的變化
3如果是請求轉發 那麼session 和request 都可以set 位址列不發生變化,可以取到
4 請求轉發 可以直接寫/ 資源名字
request.getRequestDispatcher(“/home.jsp”).forward(request, response);
5 重定向的 / 表示:http://伺服器ip:埠
請求轉發的 / 表示:http://伺服器ip:埠/專案名
java.lang.IllegalStateException 遇到的情況
就是在本次的請求轉發之前 已經把該請求轉發出去了