本示例知识点包括:
使用cookie记住用户名及密码、记录用户上次登录时间、登录次数、本次登录用户的信息并回显等、登录时的正则判断、拦截器的使用、双form标签的简单示例..
先来看后台控制层登录方法的代码逻辑(如图所示):
对应代码如下:
@RequestMapping("/doLogin")
// 这里使用了双form表单后端验证,没有或不会使用的小伙伴BindingResult之前的参数都可删除
public String doLogin(@Validated @ModelAttribute("user") User user, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, HttpSession session) {
String name = user.getName(); // 获取前台传来对象中的name(用户名)的值
userService.upCount(name); // 根据用户名记录登录次数,无论密码正确与否都会记录
// 双form表单验证功能:和实体对应,若实体对应参数有注解,此处会进行验证,若有误,则返回true,执行方法体
if (result.hasErrors()) {
// 执行方法体返回登录页面,通常用于非空校验和用户输入的值的格式校验
return "doLogin";
}
// 若正则验证通过,及执行登录方法
User user1 = userService.doLogin(user); // 判断用户输入的信息与数据库是否匹配,匹配则user1不为空
if (user1 != null) {
// 登录成功,将查询出来的用户信息存入session域
// 该操作可用于回显用户信息(用户昵称,上次登录时间,登录次数等等)以及未登录访问页面的拦截器
session.setAttribute("LOGIN_USER", user1);
// 登录成功,记录本次登录时间
userService.upTime(user1); // 细节:在存session域之后刷新登录时间,刚刚存入session域中对象的登录时间即为上次登录时间
String rem = request.getParameter("rem"); // 通过request域对象获取前端页面传来的复选框(记住密码)的值
// 创建cookie对象,对象中登录成功存查询出的对象的用户名和密码
Cookie cookie = new Cookie("usermsg", user1.getName() + "_" + user1.getPwd());
if (rem != null) { // 如果复选框rem的值不为空,说明用户要求记住密码
cookie.setMaxAge(60 * 60 * 24 * 3); // 此行代码的作用是设置cookie的生存时间,以秒为单位
} else {
cookie.setMaxAge(0); // 没有要求记住密码,cookie生存时间设置为0
}
cookie.setPath("/"); // 此处的参数,是相对于应用服务器存放应用的文件夹的根目录而言的(比如tomcat下面的webapp)
// 因此cookie.setPath("/");之后,可以在webapp文件夹下的所有应用共享cookie
response.addCookie(cookie); // 通过response.addCookie(Cookie cookie)向客户端设置Cookie。
} else {
// 登录失败,前台输入的值和数据库不匹配,通过双form表单属性提示错误信息
result.rejectValue("pwd", null, "账号密码不一致!"); // 可自定义,不会使用双form表单的朋友忽略这里
return "doLogin"; // 登录失败返回登录页面
}
return "redirect:showPact"; // 登录成功则重定向至 展示信息页面
}
前端页面代码及注释详解:
对应代码如下:拿去测试
<%--前端页面java小脚本--%>
<%
// 此处定义的三个空字符串便于下面存值与回显
String name = "";
String pwd = "";
String rem = "";
/*通过request域对象获取所有cookie*/
Cookie[] arr = request.getCookies();
/*对数组对象进行非空判断,避免异常。不为空则说明存有cookie*/
if (arr != null) {
for (Cookie cookie : arr) { // 遍历该cookie数组
// 若刚刚存在cookie中的name值等于cookie对象中的name值,则说明该cookie存在
if ("usermsg".equals(cookie.getName())) {
String value = cookie.getValue(); // 获取对应名称的value
String[] s = value.split("_"); // 存入时以什么分割这里就以什么切割,由你来决定
name = s[0]; // 分别给上面预定义的字符串赋值,便于页面回显
pwd = s[1];
rem = "checked"; // 进入该方法体则说明记住密码被选中,将它勾选
}
}
}
%>
<%--@elvariable id="user" type="com.yangziqiang.entity.User"--%>
<%--这里使用了双form表单,不会使用者忽略正常写即可,path对应的即name属性--%>
<form:form action="doLogin" method="post" modelAttribute="user">
<%--嵌入java小脚本,该表达式可获取name中的值--%>
用户名: <form:input path="name" value="<%=name%>"></form:input>
<form:errors path="name" cssStyle="color: red"></form:errors> <%--双form表单特性:用于存放错误信息--%>
<br><br>
密 码: <form:password path="pwd" value="<%=pwd%>"></form:password>
<form:errors path="pwd" cssStyle="color: red"></form:errors>
<br><br>
<input type="checkbox" name="rem" <%=rem%>>记录登录密码<br><br>
<input type="submit" value="登录">
<a href="toRegister">前往注册</a>
</form:form>
一行代码,一行注释;耐心阅读,掌握逻辑,编程其实并没有想象中那么复杂~
这里没有做登录失败次数限制处理,后续会加入
登录拦截器的使用详解(未登录不允许访问除登录外的页面,登录过期等):
简单的登录拦截示例---HandlerInterceptor拦截器的使用【一看就懂】
如有错误,欢迎指正
Thanks