Java登录 完整示例 详解(cookie、session、拦截器的使用等)【一看就懂】

本示例知识点包括:

       使用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>
    密&emsp;码: <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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hah杨大仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值