JavaWeb 登錄與注銷
大致流程
一般我們在Web應用中 登錄頁面一般是以 login.jsp的首頁
大致流程如下:
當我們在前台寫入用戶名和密碼之后,點擊登錄按鈕
會將表單提交給一個LoginServlet
讓它去驗證用戶名和密碼是否正確
- 用戶名或密碼錯誤 重新返回登陸頁面 並提示
- 登陸成功后 會進入自己WEB-INF的網頁
進入系統里的網頁后 有用戶自己的信息顯示
點擊注銷按鈕 實現注銷 重新回到登陸頁面
登錄
當點擊提交按鈕 會給LoginServlet處理請求 調用service方法
登陸成功后 會將個人信息放到Session 用於傳遞用戶數據
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
// 1. 獲取請求參數 得到輸入的用戶名和密碼
String username = req.getParameter("username");
String pwd = req.getParameter("password");
// 2. 業務邏輯
User user = dao.getUserByUserName(username);
// 3. 控制頁面跳轉
if (user == null) {
req.setAttribute("errorMes","用戶不存在");
req.getRequestDispatcher("/login.jsp").forward(req, resp);
return;
}
// 驗證密碼
if (!user.getPassword().equals(pwd)) {
req.setAttribute("errorMes","用戶或密碼錯誤");
req.getRequestDispatcher("/login.jsp").forward(req, resp);
return;
}
// 此時 用戶名 和密碼正確 共享用戶信息 進入跳轉頁面
req.getSession().setAttribute("USER_IN_SESSION", user);
resp.sendRedirect("/product");
}
上述代碼中dao.getUserByUserName(username) 方法是通過查詢數據庫用戶名得到一個用戶
public User getUserByUserName(String username) {
String sql = "SELECT * FROM t_user WHERE username = ?";
// 返回一個User對象
return JdbcTemplate.query(sql, new IResultSetHandler<User>() {
@Override
public User handle(ResultSet rs) throws SQLException {
User user = new User();
while(rs.next()) {
user.setId(rs.getLong("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
return user;
}
return null;
}
}, username);
}
dao.getUserByUserName(username) 方法使用到了JDBC的查詢操作
所以調用了JdbcTemplate.query方法
public static <T> T query(String sql,IResultSetHandler<T> rsh,Object...params){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtil.getConnection(); //連接
ps = conn.prepareStatement(sql); //語句對象
// 設置占位符值
for (int i = 0; i < params.length; i++) {
ps.setObject(i+1, params[i]);
}
rs = ps.executeQuery(); //執行語句對象
// 調用結果集處理器的handle方法 返回一個結果
return rsh.handle(rs);
} catch (Exception e) {
e.printStackTrace();
}finally {
// 釋放資源
JdbcUtil.close(conn, ps, rs);
}
return null;
}
防止沒有登陸直接訪問 處理系統內部的Servlet 在該Servlet中加一個判斷
如果沒有登陸 Session沒有USER_IN_SESSION這個屬性
則返回到登陸首頁
// 根據USER_IN_SESSION 有無 判斷此時用戶是否 登陸 若無 則不能直接訪問該頁面
Object user = req.getSession().getAttribute("USER_IN_SESSION");
if (user == null) {
resp.sendRedirect("/login.jsp");
return;
}
注銷
當點擊注銷按鈕時 進入LoginServlet處理
可以讓按鈕帶個參數 讓Servlet調用注銷方法
<a href="/login?method=logout">注銷</a>
在LoginServlet的service方法中加入如下代碼:
// 注銷功能
String method = req.getParameter("method");
if ("logout".equals(method)) {
logout(req,resp);
return;
}
注銷:銷毀用戶Session 跳轉到登陸頁面
private void logout(HttpServletRequest req, HttpServletResponse resp) {
// 銷毀session 跳到登陸頁面
req.getSession().invalidate();
try {
resp.sendRedirect("/login.jsp");
} catch (IOException e) {
e.printStackTrace();
}
}