文章目录
登出、注册、注销、修改
登出属于断开登录,操作session就可以解决
应用更改数据库的处理模式,add,delete,modify都是属于事务处理操作
登出操作的实现逻辑及方式
清楚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");
// 跳转到登录页面
response.sendRedirect(request.getContextPath() + "/jsp/login.jsp");
}
Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
<!--注册Logout servlet-->
<servlet>
<servlet-name>logout</servlet-name>
<servlet-class>com.dashangms.servlet.user.LogoutServlet</servlet-class>
</servlet>
<!--Logout servlet请求路径-->
<servlet-mapping>
<servlet-name>logout</servlet-name>
<url-pattern>/logout</url-pattern>
</servlet-mapping>
防止用户登出后可以继续访问
- 思路:页面登出时先走login拦截器,如果session清空就说明已退出
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 {
/**
* 执行过滤操作
*
* @param request Servlet请求,用于获取HTTP请求信息
* @param response Servlet响应,用于向客户端发送数据
* @param chain 过滤链,用于将请求传递给下一个过滤器或目标资源
* @throws IOException 如果在执行过程中发生I/O错误
* @throws ServletException 如果在执行过程中发生Servlet错误
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{
// 将ServletRequest和ServletResponse转换为HttpServletRequest和HttpServletResponse
// 以使用它们提供的高级功能和方法
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
// 检查用户会话中是否存在用户信息
// 如果不存在,说明用户未登录或会话已过期
if (httpServletRequest.getSession().getAttribute(Constants.USER_SESSION) == null) {
// 重定向用户到错误页面
// 这里假设错误页面为"/error.jsp",实际路径应根据项目具体结构设置
httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/error.jsp");
} else {
// 如果用户会话中存在用户信息,继续执行过滤链
// 这允许请求继续传递到目标资源或下一个过滤器
chain.doFilter(request, response);
}
}
@Override
public void init() throws ServletException {
super.init();
}
@Override
public void destroy() {
super.destroy();
}
}
- 登出后访问任意页面走过滤器处理
<!-- 判断用户是否登录的过滤器-->
<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>
修改密码功能实现
导入jsp
<li><a href=${pageContext.request.contextPath}"/jsp/pwdmodify.jsp">密码修改</a></li>
实现Dao层数据接口
- 在Dao写一个接口
int updatePwd(Connection connection, Integer id, String newPwd) throws Exception;
- 实现这个接口
/**
* 更新用户密码
*
* @param connection 数据库连接对象
* @param id 用户id
* @param newPwd 新密码
* @return 影响行数
* @throws Exception 异常处理
*/
@Override
public int updatePwd(Connection connection, Integer id, String newPwd) throws Exception {
// 初始化影响行数为0
int updateRow = 0;
// 检查数据库连接是否为空
if (connection != null){
// 预编译SQL语句以提高性能和安全性
PreparedStatement preparedStatement = null;
String sql = "update smbms_user set userPassword = ? where id = ?";
preparedStatement = connection.prepareStatement(sql);
// 设置SQL语句参数
preparedStatement.setString(1, newPwd);
preparedStatement.setInt(2, id);
// 执行更新操作并获取影响行数
updateRow = preparedStatement.executeUpdate();
// 关闭数据库连接和预编译语句资源
BaseDao.closeResource(connection, preparedStatement, null);
}
// 返回影响行数
return updateRow;
}
实现Service层业务接口
- 在Service上写一个接口
/**
* 修改密码
* @param id 用户id
* @param newPwd 新密码
* @return 修改成功 flag
*/
public boolean updatePwd(Integer id, String newPwd);
- 实现这个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;
}
注册Servlet
- 多个按钮会在同一个Servlet的中调用不同的方法;
- 相关密码的check逻辑:
- 密码不能为空
- 密码与旧密码不能相同
- 密码输入要合法化
- 密码修改成功与否都会返回原页面。有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请求对象,用于获取请求参数和进行页面转发
* @param resp HTTP响应对象,用于进行页面转发
* @throws ServletException 如果Servlet操作出错
* @throws IOException 如果输入输出操作出错
*/
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;
// 创建UserService对象
UserService userService = new UserServiceImpl();
if (user.getUserPassword().isEmpty()) {
req.getSession().setAttribute("message", "密码不能为空!");
} else if (user.getUserPassword().equals(newPwd)) {
req.getSession().setAttribute("message", "新密码不能与旧密码相同!");
} else {
// 调用UserService的updatePwd方法更新用户密码
if (userService.updatePwd(Integer.parseInt(id), newPwd)) {
req.getSession().setAttribute("message", "密码修改成功!请使用新密码重新登陆");
// 移除用户会话中的用户信息,表示用户已经注销
req.getSession().removeAttribute("user");
} else {
// 如果密码更新失败,转发到错误页面
req.getSession().setAttribute("message", "密码更新失败!");
}
}
// 如果密码更新成功,转发到密码修改页面
req.getRequestDispatcher("/pwdmodify.jsp").forward(req, resp);
}
}
- 注册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>
注册和注销 用户的方式
同上 改善点
导入jsp
可以共同使用同一个页面,根据前面页面传的值使用hidden确定显示哪部分内容;
实现Dao层的数据逻辑
- 插入新用户 insert
- 注销(删除)新用户 update (逻辑删除)
实现Service逻辑
- 插入新用户 insert
- 使用前先判断是否有同样的账号,判断一致性插入
- 注销(删除)新用户 update (逻辑删除)
- 停用功能,:停用和启用相对应,不会删除数据
- 删除功能
- 物理删除?
- 逻辑删除?
注册Servlet
同样在UserServlet中调用其他的逻辑,主要点 在jsp中确定实现
不需要再新注册Servlet来实现