JavaWeb 自動登入和退出(圖解程式碼執行流程)
阿新 • • 發佈:2018-12-25
自動登入
主要通過cookie和session的使用,實現自動登入
第一次登入執行流程
使用者第一次登入的時候,只要勾選自動登入功能,我們就生成一個cookie,並將使用者名稱和密碼儲存到cookie中存放到使用者的瀏覽器中
生成cookie的程式碼:
// 判斷使用者是不是想自動登入
String auto = request.getParameter("auto");
if ("ok".equalsIgnoreCase(auto)) {
// 說明使用者想自動登入
Cookie cookie = new Cookie("autoLogin", userFind.getUsername() + "&" + userFind.getPassword());
// 設定cookie的存活時間和繫結路徑
cookie.setMaxAge(360000);
cookie.setPath(request.getContextPath());
// 在響應中新增cookie,並返回給瀏覽器
response.addCookie(cookie);
}
第二次登入執行流程
有了使用者的cookie後,我們就可以到cookie中讀取使用者的賬號和密碼,進行自動登入,但是登入成功後將使用者名稱和密碼放到session中,否則每次使用者點選我們的頁面中的連結時,我們都需要到資料庫查詢判斷,影響效率
AutoLoginFilter程式碼
import java.io.IOException;
import java.sql.SQLException;
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;
import com.itheima.domain.User;
import com.itheima.service.UserService;
import com.itheima.service.impl.UserServiceImpl;
public class AutoLoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
/**
* 處理過濾資訊方法
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
Object object = req.getSession().getAttribute("user");
// 如果從session中獲取user為空,我們才需要獲取cookie進行登陸以及存放到session中,否則直接放行
if (object == null) {
// 獲取請求攜帶的cookies
Cookie[] cookies = req.getCookies();
Cookie cookie = null;
// 先要判斷獲取的cookies是否存在,不然遍歷的時候會報空指標異常
if (cookies != null && cookies.length > 0) {
// 遍歷cookies
for (Cookie c : cookies) {
String name = c.getName();
if ("autoLogin".equals(name)) {
// 說明cookie中存在自動登入資訊
cookie = c;
break;
}
}
}
try {
// 說明存在自動登陸的cookie
if (cookie != null) {
// 我們需要把cookie的值讀取出來存放到session中
String[] split = cookie.getValue().split("&");
User user = new User();
user.setUsername(split[0]);
user.setPassword(split[1]);
// 呼叫service層登陸
UserService service = new UserServiceImpl();
User userBack = service.login(user);
if (userBack != null) {// 說明登陸成功
req.getSession().setAttribute("user", userBack);
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 如果不存在直接 放行
chain.doFilter(req, resp);
// 過濾響應
}
@Override
public void destroy() {
}
}
退出
退出的主要思路就是把session中和cookie中使用者資訊幹掉
public void loginOut(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 幹掉cookie和session
HttpSession session = request.getSession();
session.removeAttribute("user");
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie c : cookies) {
if ("autoLogin".equals(c.getName())) {
//設定cookie存活時間為0
c.setMaxAge(0);
//將cookie響應到前臺
response.addCookie(c);
break;
}
}
}
// 重定向到首頁
response.sendRedirect(request.getContextPath() + "/index.html");
}