• 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();
    		}
    	}
    
  • 相关阅读:
    团队冲刺03
    梦断代码 阅读笔记02
    团队冲刺02
    团队冲刺01
    周总结
    团队工作任务
    阅读笔记3
    梦断代码阅读笔记01
    周总结
    NABCD项目分析
  • 原文地址:https://www.cnblogs.com/yhnCoder/p/13034099.html
Copyright © 2020-2023  润新知