1. 程式人生 > >好記性不如爛筆頭34-利用java過濾器實現使用者自動登入

好記性不如爛筆頭34-利用java過濾器實現使用者自動登入

在很多的網站中,都有自動登入的功能,實現自動登入的方法有很多種方式,利用JAVA過濾器也能夠實現使用者的自動登入。
1、 實現使用者自動登入的基本原理
在使用者登陸成功後,傳送一個cookie給客戶端,cookie的值為使用者名稱和md5加密後的密碼。
編寫一個AutoLoginFilter,這個filter檢查使用者是否帶有指定名稱的cookie來,如果有,則查詢cookie的使用者名稱和密碼是否和資料庫匹配,匹配則向session中存入user物件(即使用者登陸標記),以實現程式完成自動登陸。
在下面的示例中,為了簡單處理,都是用明碼進行簡單處理。在實際專案中千萬不要依樣畫葫蘆。
2、 用JAVA過濾器實現使用者自動登入的原始碼-登入模組

package com.autoLogin;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 通過過濾器實現自動登入-登入模組
 * @author
範芳銘 */
public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("name"); String password = request.getParameter("pass"); response.setCharacterEncoding("UTF-8"
);//設定將字元以"UTF-8"編碼輸出到客戶端瀏覽器 //通過設定響應頭控制瀏覽器以UTF-8的編碼顯示資料,瀏覽器顯示亂碼的解決方法 response.setHeader("content-type", "text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); User user = null; user = (User)request.getSession().getAttribute("user"); if (user == null){ //如果不能從過濾器中獲取user物件,那麼看是否使用者輸入了登入必要的資訊 user = new User(); user.setName(username); user.setPass(password); } //驗證,簡化處理 if((user.getName() == null) || (user.getPass() == null)){ out.print("使用者名稱或密碼不對!!"); return; }else{ //有內容就當成功 request.getSession().setAttribute("user", user); //傳送自動登陸cookie給客戶端瀏覽器進行儲存 sendAutoLoginCookie(request,response,user); out.print("登入成功"); //request.getRequestDispatcher("/index.jsp").forward(request, response); } } //傳送自動登入cookie給客戶端瀏覽器 private void sendAutoLoginCookie(HttpServletRequest request, HttpServletResponse response, User user) { if (request.getParameter("logintime")!=null) { int logintime = Integer.parseInt(request.getParameter("logintime")); //建立cookie,cookie的名字是autologin,值是使用者登入的使用者名稱和密碼,用.進行分割 Cookie cookie = new Cookie("autologin",user.getName() + "." + user.getPass()); //設定cookie的有效期 cookie.setMaxAge(logintime); //設定cookie的有效路徑 cookie.setPath(request.getContextPath()); //將cookie寫入到客戶端瀏覽器 response.addCookie(cookie); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

3、 用JAVA過濾器實現使用者自動登入的原始碼-過濾器模組

package com.autoLogin;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 通過過濾器實現自動登入-過濾器
 * @author 範芳銘
 */
public class AutoLoginFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        // 如果已經登入了,就直接chain.doFilter(request, response)放行
        if (request.getSession().getAttribute("user") != null) {
            chain.doFilter(request, response);
            System.out.println("使用者名稱稱和密碼匹配,自動登入成功");
            return;
        }

        // 1.得到使用者帶過來的authlogin的cookie
        String value = null;
        Cookie cookies[] = request.getCookies();
        for (int i = 0; cookies != null && i < cookies.length; i++) {
            if (cookies[i].getName().equals("autologin")) {
                value = cookies[i].getValue();
            }
        }

        // 2.得到 cookie中的使用者名稱和密碼
        if (value != null) {
            String username = value.split("\\.")[0];
            String password = value.split("\\.")[1];

            // 3.根據使用者名稱和密碼獲取使用者資訊,這裡簡單處理
            User user = new User();
            String name = user.getName();
            String pass = user.getPass();

            // 4.檢查使用者帶過來的md5的密碼和資料庫中的密碼是否匹配,這裡直接用明碼示例
            if (username.equals(name) & password.equals(pass)) {
                request.getSession().setAttribute("user", user);
                System.out.println("使用者名稱稱和密碼匹配");
            } else {
                System.out.println("使用者名稱稱和密碼不對,不能自動登入。");
            }
        }

        chain.doFilter(request, response);
    }

    public void destroy() {

    }

    public void init(FilterConfig filterConfig) throws ServletException {

    }
}

4、 用JAVA過濾器實現使用者自動登入的原始碼-使用者模組

package com.autoLogin;
/**
 * 通過過濾器實現自動登入-簡單使用者模組-僅用於示例
 * @author 範芳銘
 */
public class User {
    private String name;
    private String pass;

    public User(){
        this.name = "ffm";
        this.pass = "pass";
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPass() {
        return pass;
    }
    public void setPass(String pass) {
        this.pass = pass;
    }

}

5、 修改web.xml

    <filter>
        <filter-name>easyFilter</filter-name>
        <filter-class>com.autoLogin.AutoLoginFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>easyFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping> 

    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>com.autoLogin.LoginServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>

6、      用JAVA過濾器實現使用者自動登入的原始碼-移除cookie模組
有的業務不需要使用cookie,需要進行移除,可以用下面的類進行處理:

``````

package com.autoLogin;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CancelAutoLoginServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 移除儲存在session中的user
        request.getSession().removeAttribute("user");
        // 移除自動登入的cookie
        removeAutoLoginCookie(request, response);
        // 登出使用者後跳轉到登入頁面
        request.getRequestDispatcher("/login.jsp").forward(request, response);
    }

    /**
     * @Description: 刪除自動登入cookie,
     *               JavaWeb中刪除cookie的方式就是新建立一個cookie,新建立的cookie與要刪除的cookie同名,
     *               設定新建立的cookie的cookie的有效期設定為0,有效路徑與要刪除的cookie的有效路徑相同
     */
    private void removeAutoLoginCookie(HttpServletRequest request,
            HttpServletResponse response) {
        // 建立一個名字為autologin的cookie
        Cookie cookie = new Cookie("autologin", "");
        // 將cookie的有效期設定為0,命令瀏覽器刪除該cookie
        cookie.setMaxAge(0);
        // 設定要刪除的cookie的path
        cookie.setPath(request.getContextPath());
        response.addCookie(cookie);
    }

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