【項(xiàng)目實(shí)踐】SMBMS(Javaweb版)(三)登出、注冊(cè)、注銷、修改
文章目錄
登出、注冊(cè)、注銷、修改
登出屬于斷開登錄,操作session就可以解決
應(yīng)用更改數(shù)據(jù)庫(kù)的處理模式,add,delete,modify都是屬于事務(wù)處理操作
登出操作的實(shí)現(xiàn)邏輯及方式
清楚session就可以,不再保存登錄記錄
package com.dashangms.servlet.user;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LogoutServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 移除session 中的用戶信息
request.getSession().removeAttribute("user");
// 跳轉(zhuǎn)到登錄頁(yè)面
response.sendRedirect(request.getContextPath() + "/jsp/login.jsp");
}
Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
<!--注冊(cè)Logout servlet-->
<servlet>
<servlet-name>logout</servlet-name>
<servlet-class>com.dashangms.servlet.user.LogoutServlet</servlet-class>
</servlet>
<!--Logout servlet請(qǐng)求路徑-->
<servlet-mapping>
<servlet-name>logout</servlet-name>
<url-pattern>/logout</url-pattern>
</servlet-mapping>
防止用戶登出后可以繼續(xù)訪問(wèn)
- 思路:頁(yè)面登出時(shí)先走login攔截器,如果session清空就說(shuō)明已退出
package com.dashangms.filter;
import com.common.Constants;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginFilter extends HttpFilter {
/**
* 執(zhí)行過(guò)濾操作
*
* @param request Servlet請(qǐng)求,用于獲取HTTP請(qǐng)求信息
* @param response Servlet響應(yīng),用于向客戶端發(fā)送數(shù)據(jù)
* @param chain 過(guò)濾鏈,用于將請(qǐng)求傳遞給下一個(gè)過(guò)濾器或目標(biāo)資源
* @throws IOException 如果在執(zhí)行過(guò)程中發(fā)生I/O錯(cuò)誤
* @throws ServletException 如果在執(zhí)行過(guò)程中發(fā)生Servlet錯(cuò)誤
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{
// 將ServletRequest和ServletResponse轉(zhuǎn)換為HttpServletRequest和HttpServletResponse
// 以使用它們提供的高級(jí)功能和方法
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
// 檢查用戶會(huì)話中是否存在用戶信息
// 如果不存在,說(shuō)明用戶未登錄或會(huì)話已過(guò)期
if (httpServletRequest.getSession().getAttribute(Constants.USER_SESSION) == null) {
// 重定向用戶到錯(cuò)誤頁(yè)面
// 這里假設(shè)錯(cuò)誤頁(yè)面為"/error.jsp",實(shí)際路徑應(yīng)根據(jù)項(xiàng)目具體結(jié)構(gòu)設(shè)置
httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/error.jsp");
} else {
// 如果用戶會(huì)話中存在用戶信息,繼續(xù)執(zhí)行過(guò)濾鏈
// 這允許請(qǐng)求繼續(xù)傳遞到目標(biāo)資源或下一個(gè)過(guò)濾器
chain.doFilter(request, response);
}
}
@Override
public void init() throws ServletException {
super.init();
}
@Override
public void destroy() {
super.destroy();
}
}
- 登出后訪問(wèn)任意頁(yè)面走過(guò)濾器處理
<!-- 判斷用戶是否登錄的過(guò)濾器-->
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.csnz.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/jsp/*</url-pattern>
</filter-mapping>
修改密碼功能實(shí)現(xiàn)
導(dǎo)入jsp
<li><a href=${pageContext.request.contextPath}"/jsp/pwdmodify.jsp">密碼修改</a></li>
實(shí)現(xiàn)Dao層數(shù)據(jù)接口
- 在Dao寫一個(gè)接口
int updatePwd(Connection connection, Integer id, String newPwd) throws Exception;
- 實(shí)現(xiàn)這個(gè)接口
/**
* 更新用戶密碼
*
* @param connection 數(shù)據(jù)庫(kù)連接對(duì)象
* @param id 用戶id
* @param newPwd 新密碼
* @return 影響行數(shù)
* @throws Exception 異常處理
*/
@Override
public int updatePwd(Connection connection, Integer id, String newPwd) throws Exception {
// 初始化影響行數(shù)為0
int updateRow = 0;
// 檢查數(shù)據(jù)庫(kù)連接是否為空
if (connection != null){
// 預(yù)編譯SQL語(yǔ)句以提高性能和安全性
PreparedStatement preparedStatement = null;
String sql = "update smbms_user set userPassword = ? where id = ?";
preparedStatement = connection.prepareStatement(sql);
// 設(shè)置SQL語(yǔ)句參數(shù)
preparedStatement.setString(1, newPwd);
preparedStatement.setInt(2, id);
// 執(zhí)行更新操作并獲取影響行數(shù)
updateRow = preparedStatement.executeUpdate();
// 關(guān)閉數(shù)據(jù)庫(kù)連接和預(yù)編譯語(yǔ)句資源
BaseDao.closeResource(connection, preparedStatement, null);
}
// 返回影響行數(shù)
return updateRow;
}
實(shí)現(xiàn)Service層業(yè)務(wù)接口
- 在Service上寫一個(gè)接口
/**
* 修改密碼
* @param id 用戶id
* @param newPwd 新密碼
* @return 修改成功 flag
*/
public boolean updatePwd(Integer id, String newPwd);
- 實(shí)現(xiàn)這個(gè)Service
/**
* 修改密碼
*
* @param id 用戶id
* @param newPwd 新密碼
* @return 修改成功 flag
*/
@Override
public boolean updatePwd(Integer id, String newPwd) {
Connection conn = null;
boolean flag = false;
try {
conn = BaseDao.connection();
if (userDao.updatePwd(conn, id, newPwd) > 0){
flag = true;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
BaseDao.closeConnection(conn);
}
return flag;
}
注冊(cè)Servlet
- 多個(gè)按鈕會(huì)在同一個(gè)Servlet的中調(diào)用不同的方法;
- 相關(guān)密碼的check邏輯:
- 密碼不能為空
- 密碼與舊密碼不能相同
- 密碼輸入要合法化
- 密碼修改成功與否都會(huì)返回原頁(yè)面。有msg顯示。
package com.dashangms.servlet.user;
import com.dashangms.pojo.User;
import com.dashangms.service.user.UserService;
import com.dashangms.service.user.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getParameter("method");
if ("savePassword".equals(method)) {
savePassword(req, resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
/**
* 保存用戶新密碼
*
* @param req HTTP請(qǐng)求對(duì)象,用于獲取請(qǐng)求參數(shù)和進(jìn)行頁(yè)面轉(zhuǎn)發(fā)
* @param resp HTTP響應(yīng)對(duì)象,用于進(jìn)行頁(yè)面轉(zhuǎn)發(fā)
* @throws ServletException 如果Servlet操作出錯(cuò)
* @throws IOException 如果輸入輸出操作出錯(cuò)
*/
private void savePassword(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 獲取用戶ID和新密碼
String id = req.getParameter("id");
String newPwd = req.getParameter("newPwd");
Object object = req.getSession().getAttribute("user");
User user = (User) object;
// 創(chuàng)建UserService對(duì)象
UserService userService = new UserServiceImpl();
if (user.getUserPassword().isEmpty()) {
req.getSession().setAttribute("message", "密碼不能為空!");
} else if (user.getUserPassword().equals(newPwd)) {
req.getSession().setAttribute("message", "新密碼不能與舊密碼相同!");
} else {
// 調(diào)用UserService的updatePwd方法更新用戶密碼
if (userService.updatePwd(Integer.parseInt(id), newPwd)) {
req.getSession().setAttribute("message", "密碼修改成功!請(qǐng)使用新密碼重新登陸");
// 移除用戶會(huì)話中的用戶信息,表示用戶已經(jīng)注銷
req.getSession().removeAttribute("user");
} else {
// 如果密碼更新失敗,轉(zhuǎn)發(fā)到錯(cuò)誤頁(yè)面
req.getSession().setAttribute("message", "密碼更新失敗!");
}
}
// 如果密碼更新成功,轉(zhuǎn)發(fā)到密碼修改頁(yè)面
req.getRequestDispatcher("/pwdmodify.jsp").forward(req, resp);
}
}
- 注冊(cè)Servlet
<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>com.dashangms.servlet.user.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/jsp/user.do</url-pattern>
</servlet-mapping>
注冊(cè)和注銷 用戶的方式
同上 改善點(diǎn)
導(dǎo)入jsp
可以共同使用同一個(gè)頁(yè)面,根據(jù)前面頁(yè)面?zhèn)鞯闹凳褂胔idden確定顯示哪部分內(nèi)容;
實(shí)現(xiàn)Dao層的數(shù)據(jù)邏輯
- 插入新用戶 insert
- 注銷(刪除)新用戶 update (邏輯刪除)
實(shí)現(xiàn)Service邏輯
- 插入新用戶 insert
- 使用前先判斷是否有同樣的賬號(hào),判斷一致性插入
- 注銷(刪除)新用戶 update (邏輯刪除)
- 停用功能,:停用和啟用相對(duì)應(yīng),不會(huì)刪除數(shù)據(jù)
- 刪除功能
- 物理刪除?
- 邏輯刪除?
注冊(cè)Servlet
同樣在UserServlet中調(diào)用其他的邏輯,主要點(diǎn) 在jsp中確定實(shí)現(xiàn)
不需要再新注冊(cè)Servlet來(lái)實(shí)現(xiàn)

浙公網(wǎng)安備 33010602011771號(hào)