登录要求
- 用户登录成功,页面显示:欢迎您!xxx 并且显示退出、我的购物车、我的订单按钮;退出登录:页面只有登录、注册按钮
- 登录可勾选自动登录和记住用户名
- 自动登录:关闭浏览器,再次打开浏览器,进入商城主页是,自动登录
- 记住用户名:下次登录时,用户名输入框中直接显示用户名,不需要手动输入
实现步骤
用户登录
首先判断输入的验证码是否正确,如验证码错误,则直接转发到登录页面,并提示验证码输入错误;验证码输入正确,再判断用户名和密码是否正确。从客户端获取用户名和密码,查询数据库,验证用户名和密码是否正确。若登录失败,则转发到登录页面并提示登录失败信息:用户名或密码正确;用户未激活。
- 利用异常来获取登陆失败的信息。在登录成功的前提下,如果勾选自动登录、记住用户名复选框,将用户名和密码存储在cookie中
//用户登录
public String userLogin(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException {
request.setCharacterEncoding("utf-8");
//1、获取输入验证码参数
String inputCheckCode = request.getParameter("loginCheckCode");
//2、获取生成验证码
HttpSession session = request.getSession();
String checkCodeSession = (String) session.getAttribute("checkCodeSession");
//3、移除session中存储的验证码
session.removeAttribute("checkCodeSession");
//验证码输入正确,接收用户数据,开始登录
if (checkCodeSession != null && checkCodeSession.equalsIgnoreCase(inputCheckCode)) {
User user = new User();
MyBeanUtils.populate(user, request.getParameterMap());
UserService userService = new UserServiceImp();
try {
User loginUser = userService.userLogin(user);
//登录成功
//存储用户信息
session.setAttribute("loginUser", loginUser);
//在登录成功的基础上,判断用户是否选中自动登录复选框
String autoLogin = request.getParameter("autoLogin");
if ("yes".equals(autoLogin)) {
//用户选中自动登录复选框
Cookie ck = new Cookie("autoLogin", user.getUsername() + "#" + user.getPassword());
ck.setPath("/mall");
ck.setMaxAge(23423424);
response.addCookie(ck);
}
//remUser
String remUser = request.getParameter("remUser");
if ("yes".equals(remUser)) {
//用户选中记住用户名复选框
Cookie ck = new Cookie("remUser", user.getUsername());
ck.setPath("/mall");
ck.setMaxAge(23423424);
response.addCookie(ck);
}
//重定向
response.sendRedirect(request.getContextPath() + "/index.jsp");
return null;
} catch (RuntimeException e) {
//登录失败
//存储提示信息到request
String loginError = e.getMessage();
request.setAttribute("loginError", loginError);
return "/jsp/login.jsp";
}
} else {
//存储提示信息到request
request.setAttribute("registCheckCodeError", "验证码错误");
return "/jsp/login.jsp";
}
}
- 业务层,登录失败则抛出异常
public User userLogin(User user01) throws SQLException {
User userLogin = UserDao.userLogin(user01);
if (userLogin == null){
throw new RuntimeException("用户或密码错误");
}else if (userLogin.getState() == 0){
throw new RuntimeException("用户未激活");
}else {
return userLogin;
}
}
- dao层,查询数据库,验证用户名和密码
public User userLogin(User user01) {
try {
String sql = "select * from user where username =? and password=?";
return template.queryForObject(sql,
new BeanPropertyRowMapper<>(User.class),
user01.getUsername(),
user01.getPassword());
} catch (DataAccessException e) {
e.printStackTrace();
return null;
}
}
自动登录
- 自动登录过滤器
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//chain.doFilter(request, response);
//强转
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp=(HttpServletResponse) response;
User uu = (User) req.getSession().getAttribute("loginUser");
if (null != uu) {//存在以登录用户
chain.doFilter(request, response);
return;
}
//获取用户携带到服务端cookie对象
Cookie ck = CookUtils.getCookieByName("autoLogin", req.getCookies());
//获取不到,放行
if (null == ck) {
chain.doFilter(request, response);
return;
}
//获取到,获取用户名和密码 xxx#xxx
String um = ck.getValue().split("#")[0];
String up = ck.getValue().split("#")[1];
User user = new User();
user.setUsername(um);
user.setPassword(up);
//调用业务层,验证用户名及密码是否正确
UserService UserService = new UserServiceImp();
User user02 = null;
try {
user02 = UserService.userLogin(user);
} catch (Exception e) {
e.printStackTrace();
}
if (null != user02) {
//通过用户名和密码登录,登录成功:向session存放登录用户信息,放行
req.getSession().setAttribute("loginUser", user02);
chain.doFilter(request, response);
} else {
//通过用户名和密码登录,登录失败:放行
chain.doFilter(request, response);
}
}
- 配置过滤器,在web.xml中配置,所有页面需要过滤
<filter>
<display-name>AutoLoginFilter</display-name>
<filter-name>AutoLoginFilter</filter-name>
<filter-class>web.filter.AutoLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AutoLoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 登录页面,若记住用户名,则在登录时,自动从cookie中获取用户名,并设置request的属性:remUser:uesrmane,从前端用户名输入框的值则为获取的remUser属性值
public String loginUI(HttpServletRequest request, HttpServletResponse response) throws IOException, SQLException {
Cookie remUser = CookUtils.getCookieByName("remUser", request.getCookies());
if (remUser != null)
request.setAttribute("remUser", remUser.getValue());
return "/jsp/login.jsp";
}
前端
<input type="text" class="form-control" id="username" placeholder="请输入用户名" name="username"
value="${remUser}"/>
<input type="hidden" name="method" value="userLogin"/>
用户退出
用户退出,清除用户名及密码
//用户退出登录
public String logOut(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.getSession().removeAttribute("loginUser");
Cookie ck = CookUtils.getCookieByName("autoLogin", request.getCookies());
if (null != ck) {
ck.setMaxAge(0);
ck.setPath("/mall");
response.addCookie(ck);
}
response.sendRedirect(request.getContextPath() + "/index.jsp");
return null;
}