登录注销和session相结合

本文介绍了Java Web应用中登录注销的实现方式,结合Session管理用户状态。目录包括DO、Entity、DAO包结构,以及关键代码如User、UserDao、LoginServlet、LogoutServlet和相关jsp页面的概览。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.目录结构如下:

存放java bean的包
* 阿里 - domain object(领域对象) 简称 DO
* entity (实体)

存放 数据访问对象 的包
*dao - data access object 对领域对象做增删改查操作的

存放 servlet 的包
*web

 

2.关键代码如下:

User.java

public class User implements Serializable {
    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                '}';
    }
}

UserDao.java

public class UserDao {

    /**
     * 根据用户名查询用户对象
     * @param username 用户名
     * @return 查询到了,返回用户对象,如果用户不存在返回 null
     */
    public User findByUsername(String username) {
        try(Connection conn = JdbcUtils.getConnection()) {
            try(PreparedStatement stmt = conn.prepareStatement("select * from user where username=?")) {
                stmt.setString(1, username);
                ResultSet rs = stmt.executeQuery();
                if(rs.next()) {
                    // 查询到了该用户
                    User user = new User();
                    user.setUsername(rs.getString("username"));
                    user.setPassword(rs.getString("password"));
                    return user;
                } else {
                    return null;
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }
}

LoginServlet.java

@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet {

    private UserDao userDao = new UserDao();

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        User user = userDao.findByUsername(username);
        // 数据库没有此用户
        if (user == null) {
            req.setAttribute("error", "用户不存在");
            req.getRequestDispatcher("login.jsp")
                    .forward(req, resp);
            return;
        }

        // 如果数据库的密码 不等于 输入密码
        if (!user.getPassword().equals(password)) {
            req.setAttribute("error", "密码错误");
            req.getRequestDispatcher("login.jsp")
                    .forward(req, resp);
            return;
        }

        // 通过验证
        // 将登录标记存入 session 作用域
        req.getSession().setAttribute("username", username);

        req.getRequestDispatcher("welcome.jsp")
                .forward(req, resp);

    }
}

LogoutServlet.java

@WebServlet(urlPatterns = "/logout")
public class LogoutServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        // 让 session 失效
        session.invalidate();
        // 跳转至登录页面
        req.getRequestDispatcher("login.jsp").forward(req, resp);
    }
}

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
    <form action="login" method="post">
        <p>用户名:<input type="text" name="username"></p>
        <p>密码:<input type="password" name="password" ></p>
        <p><input type="submit" value="登录"></p>
    </form>
    <h4 style="color:red;">${error}</h4>
</body>
</html>

welcome.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    // 获取 session 中的 username 变量
    Object username = session.getAttribute("username");
    // 没有经过验证
    if(username == null) {
        /*
        请求转发的方式
        request.setAttribute("error", "您尚未登录");
        request.getRequestDispatcher("login.jsp").forward(request, response);
        */
        // 请求重定向方式
        session.setAttribute("error", "您尚未登录");
        response.sendRedirect("login.jsp");
        return;
    }
%>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <!-- EL 可以从作用域中获取信息-->
    登录成功!!!  欢迎 ${username} 来到本网站

    <a href="logout">注销(安全退出)</a>
</body>
</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值