【项目实践】SMBMS(Javaweb版)(三)登出、注册、注销、修改

登出、注册、注销、修改

登出属于断开登录,操作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>

防止用户登出后可以继续访问

  1. 思路:页面登出时先走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();
    }
}

  1. 登出后访问任意页面走过滤器处理
<!--    判断用户是否登录的过滤器-->
    <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层数据接口

  1. 在Dao写一个接口
int updatePwd(Connection connection, Integer id, String newPwd) throws Exception;
  1. 实现这个接口
    /**
     * 更新用户密码
     *
     * @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层业务接口

  1. 在Service上写一个接口
    /**
     * 修改密码
     * @param id 用户id
     * @param newPwd 新密码
     * @return 修改成功 flag
     */
    public boolean updatePwd(Integer id, String newPwd);
  1. 实现这个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

  1. 多个按钮会在同一个Servlet的中调用不同的方法;
  2. 相关密码的check逻辑:
  • 密码不能为空
  • 密码与旧密码不能相同
  • 密码输入要合法化
  1. 密码修改成功与否都会返回原页面。有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);
    }
}
  1. 注册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来实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨DaB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值