JavaWeb 登录与注销
大致流程
一般我们在Web应用中 登录页面一般是以 login.jsp的首页
大致流程如下:
当我们在前台写入用户名和密码之后,点击登录按钮
会将表单提交给一个LoginServlet
让它去验证用户名和密码是否正确
- 用户名或密码错误 重新返回登陆页面 并提示
- 登陆成功后 会进入自己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();
}
}