JavaWeb的登陆与注销功能

JavaWeb 登录与注销

大致流程

一般我们在Web应用中 登录页面一般是以 login.jsp的首页

大致流程如下:

当我们在前台写入用户名和密码之后,点击登录按钮

会将表单提交给一个LoginServlet

让它去验证用户名和密码是否正确

  1. 用户名或密码错误 重新返回登陆页面 并提示
  2. 登陆成功后 会进入自己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();
		}
	}
posted @ 2020-06-02 22:06  YhnCoder  阅读(1620)  评论(0编辑  收藏  举报