黑马旅游网编写练习(3)–登录和退出功能

完成用户的注册和邮箱激活功能之后,接下来进行登录功能的编写。
分析:
当用户在登陆界面输入用户名,密码以及验证码后,点击登录按钮;我们让其发送Ajax请求;servlet接收到该请求后,调用service层进行用户的查询,若该用户名和密码均正确,并且已经激活,则可以登录,我们将该用户保存在服务器的session中;否则,在登陆界面给出错误提示。

实现步骤总览

  1. 后台登录功能
  2. 前端登录信息的校验,错误提示
  3. 登陆成功后,在页面中添加用户人的姓名展示
  4. 退出功能

1. 后台登录功能

前台通过Ajax的方式访问此servlet,其中封装了用户名,密码以及验证码信息。我们通过这些信息完成登录功能,并返回json数据给前端。LoginServlet的主要代码如下:

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 接收验证码String check = request.getParameter("check");// 获取session域中的验证码信息HttpSession session = request.getSession();String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");// 获取完毕即刻清除session域中的验证码信息,以保证一次性使用session.removeAttribute("CHECKCODE_SERVER");ResultInfo info =new ResultInfo();ObjectMapper mapper = new ObjectMapper();// 判断输入的验证码是否正确if(!("".equals(check)) && check.equalsIgnoreCase(checkcode_server)){// 验证码正确System.out.println("The CheckCode input correct");}else{// 验证码输入错误System.out.println("The CheckCode input Errors");// 封装错误信息info.setFlag(false);//info.setData("checkcode");info.setErrorMsg("The CheckCode input Errors!");// 序列化info为jsonString json = mapper.writeValueAsString(info);System.out.println("From LoginServlet:--"+json);// 将json数据发送给客户端response.setContentType("application/json;charset=utf-8");response.getWriter().write(json);return;}// 接收用户信息Map<String, String[]> map = request.getParameterMap();// 封装数据到user对象User user = new User();try {BeanUtils.populate(user,map);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}// 调用service层进行登录UserService service = new UserServiceImpl();User u = service.login(user);// 判断是否登录成功if(u == null){// 登录失败,用户名或密码错误System.out.println("Login failed!, Username or Password Error!");info.setFlag(false);info.setErrorMsg("Login failed!, Username or Password Error!");}else if(u != null && "N".equals(u.getStatus())){// 登陆失败,用户未激活System.out.println("Login failed!, User have No Active!");info.setFlag(false);info.setErrorMsg("Login failed!, User have No Active!");}else if(u != null && "Y".equals(u.getStatus())){// 登陆成功session.setAttribute("user",u);System.out.println("Login succeed!");info.setFlag(true);}// 序列化info为jsonString json = mapper.writeValueAsString(info);System.out.println("From LoginServlet:--"+json);// 将json数据发送给客户端response.setContentType("application/json;charset=utf-8");response.getWriter().write(json);}

其中service层的登录方法为:

    /*** 通过用户名和密码登录,登陆成功返回user* @param user* @return*/@Overridepublic User login(User user) {String username = user.getUsername();String password = user.getPassword();return dao.findUserByUsernameAndPassword(username,password);}

其中dao层通过用户名和密码查询用户方法为:

    /*** 通过用户名和密码查询用户,若存在,返回User* @param username* @param password* @return*/@Overridepublic User findUserByUsernameAndPassword(String username, String password) {User user = null;// 定义sqlString sql = "select * from tab_user where username = ? and password = ? ";try {// 执行sqluser = template.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),username,password);} catch (DataAccessException e) {//e.printStackTrace();    //未找到该用户System.out.println("dao:--No User find by username and password");}return user;}

2. 前端登录信息的校验,错误提示

前面已经编写完毕后端的登录功能,并响应给前台json数据;接下来便是完成前台的登录实现;主要分为两个功能

  1. 为各输入框添加失去焦点事件,一旦失去焦点就进行正则校验;
  2. 点击登录按钮后对各输入框进行校验,只有校验合格才发送Ajax请求
  3. 发送Ajax请求

为各输入框添加信息校验的方法与之前注册页面的校验一样,代码如下:

    //用户名校验函数function checkUsername() {// 获取用户名var username = $("#username").val();// 定义用户名正则var reg_username = /.+/;var flag = reg_username.test(username);if(flag){// 用户名非空$("#username").css("border","");$("#errorMsg").html("");}else{// 用户名为空$("#username").css("border","1px solid red");$("#errorMsg").html("请输入用户名");}return flag;}//密码校验函数function checkPassword() {// 获取密码var password = $("#password").val();// 定义密码正则var reg_password =  /^\w{6,20}$/;var flag = reg_password.test(password);if(flag){// 密码非空$("#password").css("border","");$("#errorMsg").html("");}else{// 密码为空$("#password").css("border","1px solid red");$("#errorMsg").html("密码必须是6-20位的字母,数字或下划线");}return flag;}

然后为输入框添加失去焦点事件,当用户名和密码校验通过后,提交表单

    $(function () {$("#login_sub").click(function () {// 仅当用户名和密码校验均通过后,才提交Ajax请求if(checkUsername() && checkUsername()){$.post("loginServlet",$("#loginForm").serialize(),function (data) {if(data.flag){// 登陆成功location.href="index.html";}else{//登陆失败$("#errorMsg").html(data.errorMsg);}});}});// 为各输入框添加失去焦点事件$("#username").blur(checkUsername);$("#password").blur(checkPassword);});

3. 登陆成功后,在页面中添加用户人的姓名展示

登陆成功后默认提示的是:欢迎回来,admin
期望得到的效果是与登录用户的姓名进行绑定,不同用户登录会显示不同用户的姓名。
如果使用的是jsp页面进行展示,则可以直接从服务器获取登录用户user的信息,但是****此处使用的是html页面进行展示,****所以可以当index.html加载完成后,自动向服务器发送一个Ajax请求,获取当前登录用户的姓名。
新建一个servlet,其内容如下:

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取session域中的user对象HttpSession session = request.getSession();User user = (User) session.getAttribute("user");// 将user进行json序列化,并返回客户端response.setContentType("application/json;charset=utf-8");ObjectMapper mapper = new ObjectMapper();mapper.writeValue(response.getOutputStream(),user);}

然后在展示登陆提示的div页面块中,添加一个发送Ajax请求函数。

    <script>$(function () {$.post("helloServlet",{},function (data) {$("#log_span").html("欢迎回来,"+data.name);});});</script>

4. 退出功能

退出功能与登录功能相对应。登陆成功后,会将user对象保存在session域中;退出只需要将其销毁即可。
所以只需要在点击退出按钮是,访问servlet将session域中的user销毁,然后返回到登陆页面即可。
首先为退出按钮添加跳转:

     <a href="javascript:location.href='exitServlet';">退出</a>

然后编写退出servlet

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取session并销毁session域中数据request.getSession().invalidate();// 重定向到登陆页面response.sendRedirect(request.getContextPath()+"/login.html");}

至此,已完成了用户的注册,登录,以及退出的相关功能;接下来将会对旅游网页面的展示数据进行处理。

黑马旅游网编写练习(3)--登录和退出功能相关推荐

  1. 黑马旅游网编写练习(2)--邮箱激活功能

    黑马旅游网编写练习(2)–邮箱激活功能 当用户进行注册时,一般会需要使用邮箱进行激活:所以在这里也模拟一下注册后邮箱的激活功能. 首先导入发送邮箱的jar包mail.jar:或者配置maven地址为: ...

  2. 黑马旅游网编写练习(4)--优化工程目录结构

    黑马旅游网编写练习(4)–优化工程目录结构 经过前面的三次练习,已经实现了用户的登录,账户激活,以及用户退出的相关功能:然而在实际项目过程中,这些当然只能算是基础功能:在此过程中,我们为每一个小功能都 ...

  3. 黑马旅游网编写练习(10)--用户收藏线路的展示功能

    黑马旅游网编写练习(10)–用户收藏线路的展示功能 分析 当用户点击我的收藏按钮时,需要将用户所收藏的所有线路进行展示:并且点击响应的线路,就会跳转到该线路对应的详情页面. 旅游线路的分页展示功能之前 ...

  4. 黑马旅游网编写练习(9)--旅游线路收藏功能

    黑马旅游网编写练习(9)–旅游线路收藏功能 旅游线路收藏功能分析 在旅游详情页面,用户点击收藏按钮后,我们向服务器发送Ajax请求:然后查询用户是否登录:若用户已登录,则需要查询数据库表格判断该用户是 ...

  5. 黑马旅游网编写练习(1)--注册功能

    黑马旅游网编写练习 黑马旅游网是包含学习完java-web的一个综合项目:项目中既包含前端,也包含后端的逻辑处理.项目使用三级结构,并未使用框架技术. 本次项目使用maven管理.练习使用一些编写好的 ...

  6. 黑马旅游网编写练习(6)--旅游线路分页展示功能

    黑马旅游网编写练习(6)–旅游线路分页展示功能 首页的目录展示功能已经完成,在进入主页后,页面会自动向服务器发送Ajax请求,从而获取目录数据,我们将其名称cname展示到页面中:接下来要实现的是分页 ...

  7. 黑马旅游网编写练习(5)--目录的分类展示功能

    黑马旅游网编写练习(5)–目录的分类展示功能 我们已经把项目的结构进行了优化,接下来编写目录展示相关的功能,所以我们单独创建其文件,包含dao层,service层,以及web层,全部重新创建文件,封装 ...

  8. 黑马旅游网编写练习(7)--某一旅游线路详情展示

    黑马旅游网编写练习(7)–某一旅游线路详情展示 在分页展示的页面中,我们点击某一个旅游,想要查看详细信息,则点击了查看详情后,会跳转到该旅游路线对应的详细信息页面.接下来对该详细信息页面的查询与展示. ...

  9. 牛客网项目5:登录、退出功能

    1. 访问登录页面 点击顶部区域内的连接,打开登陆页面. index.html中: <li class="nav-item ml-3 btn-group-vertical"& ...

最新文章

  1. 象过河怎么用远程服务器,象过河远程协助的教程
  2. 被操纵的BCE与去中心化的BCH
  3. java语言的多态性及特点_Java中的方法的多态性有两种形式:( )和( )。_学小易找答案...
  4. c语言计算器实现简单的四则运算.(加,减,乘,除)实验报告,C语言数据结构“简单计算器。”1、简单计算器。请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程...
  5. python爬虫1——获取网站源代码(豆瓣图书top250信息)
  6. 第三届全国县域经济基本竞争力百强县(市)
  7. 4400 万个微软帐户使用泄露的密码
  8. html与表格无关的标记,表格和HTML5标记
  9. 深圳端午节骑行活动,欢迎大家参加
  10. kettle下载安装和连接
  11. 2017onsite比赛游记帖
  12. CDN 网站部署全站加速服务
  13. linux热迁移137error VMware vCenter Converter 问题小结
  14. mysql desc select_数据库里 desc 和 select 怎么用,代表什么意思?
  15. 支持向量机的理解,目前看到的最通透的
  16. mysql id不重复随机码_MySQL 随机不重复ID,该怎么处理
  17. 联接无止境!500万台AP潜在大数据流量入口
  18. TCP/IP sysctl命令参数
  19. 【错误汇总】zabbix 监控偶遇问题一记
  20. [转载].NET商业软件源码保护

热门文章

  1. android模拟器一直显示启动中,蓝手指安卓模拟器(BlueStacks)一直显示“启动中”如何解决?...
  2. 电影票预订座位前端js
  3. exFAT 文件系统格式
  4. 基于PaddleOCR的文字表格识别与解析方案
  5. Matrix Inverse -- 逆矩阵
  6. 2021年3月四篇深度学习论文推荐
  7. Java 用JainSip实现服务器端SIP通讯----之监听篇
  8. Android 优化 透明Activity展示loading关闭时闪烁
  9. XX年年终总结---重新飞跃
  10. 常说的一区二区含义是什么?