黑马旅游网-用户登录和退出(四)

目录

用户登录

一、分析

二、前端实现

三、后端的实现

LoginServlet

 UserService

UserServiceImpl

UserDao

UserDaoImpl

 测试

显示登录的用户信息

四、前端实现

五、后端的实现

测试

用户退出

六、前端的实现

七、后端实现

测试

八、遇到的bug

 1.登录功能的bug

2.退出功能的bug


用户登录

一、分析

 

二、前端实现

1.添加登录的id

<div class="submit_btn">
					<button type="button" id="btn_sumit">登录</button>
					<div class="auto_login">
						<input type="checkbox" name="" class="checkbox">
						<span>自动登录</span>
					</div>
				</div>

 2.跳转页面

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>卓越旅游网-登录</title>  
    <link rel="stylesheet" type="text/css" href="css/common.css">
    <link rel="stylesheet" type="text/css" href="css/login.css">
    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
      <script src="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script>
      <script src="https://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
      <!--导入angularJS文件-->
    <script src="js/angular.min.js"></script>
	<!--导入jquery-->
	<script src="js/jquery-3.3.1.js"></script>
	<script>
		$(function () {
			$("#btn_sumit").click(function () {
				//ajax提交数据
				$.post("loginServlet",$("#loginForm").serialize(),function (data) {
					if(data.flag){
						//登录成功,跳转到首页
						location.href="index.html";
					}else {
						//登录失败,显示错误信息
						$("#errorMsg").html(data.errorMsg);
					}
				})
			});
		});
	</script>
</head>

三、后端的实现

LoginServlet

package com.hotdas.travel.web.servlet;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.hotdas.travel.domain.ResultInfo;
import com.hotdas.travel.domain.User;
import com.hotdas.travel.service.UserService;
import com.hotdas.travel.service.impl.UserServiceImpl;
import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String check = request.getParameter("check");
        String checkcode_server = (String)request.getSession().getAttribute("CHECKCODE_SERVER");
        request.getSession().removeAttribute("CHECKCODE_SERVER");
        //4.提示登录信息
        ResultInfo info = new ResultInfo();

        if (checkcode_server!=null && !"".equals(checkcode_server)){
            if (!check.equalsIgnoreCase(checkcode_server)){
                info.setFlag(false);
                info.setErrorMsg("验证码有误");

                ObjectMapper objectMapper = new ObjectMapper();
                response.setCharacterEncoding("utf-8");
                response.setContentType("application/json;charset=utf-8");
                objectMapper.writeValue(response.getOutputStream(),info);
                return;
            }
        }

        //1.获取表单的数据
        Map<String, String[]> parameterMap = request.getParameterMap();
        //2.封装数据到user
        User user = new User();
        try {
            BeanUtils.populate(user,parameterMap);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        //3.调用service完成登录
        UserService userService = new UserServiceImpl();
        User u =  userService.login(user);


        if (u==null){
            //用户名和密码有误
            info.setFlag(false);
            info.setErrorMsg("用户名和密码有误");
        }

        //5.判断用户是否激活
        if (u!=null && !"Y".equals(u.getStatus())){
            //用户没有激活
            info.setFlag(false);
            info.setErrorMsg("您尚未激活,请进行邮箱激活!");
        }
        if (u!=null && "Y".equals(u.getStatus())){
            //登录成功后,用户信息保存在session中
            request.getSession().setAttribute("user",u);
            //登录成功
            info.setFlag(true);
        }

        ObjectMapper objectMapper = new ObjectMapper();
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/json;charset=utf-8");

        objectMapper.writeValue(response.getOutputStream(),info);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

 UserService

package com.hotdas.travel.service;

import com.hotdas.travel.domain.User;

public interface UserService {
    Boolean regirst(User user);
    Boolean activeUser(String code);
    //用户登录
    User login(User user);
}

UserServiceImpl

package com.hotdas.travel.service.impl;

import com.hotdas.travel.dao.UserDao;
import com.hotdas.travel.dao.impl.UserDaoImpl;
import com.hotdas.travel.domain.User;
import com.hotdas.travel.service.UserService;
import com.hotdas.travel.util.MailUtils;
import com.hotdas.travel.util.UuidUtil;

public class UserServiceImpl implements UserService {
    private UserDao userDao = new UserDaoImpl();

    @Override
    public Boolean activeUser(String code) {
        //根据激活码查询用户
        User user = userDao.findByCode(code);
        if(user!=null){
            //激活该用户  status="Y"
            userDao.activeUser(user);
            return true;
        }else{
            return false;
        }
    }

    @Override
    public Boolean regirst(User user) {
        //从数据库中查询用户
        User u =   userDao.findByUsername(user.getUsername());

        //判断用户是否存在
        if (u!=null){
            //用户存在,返回false
            return false;
        }
        //激活邮箱才可以使用
        user.setCode(UuidUtil.getUuid());
        user.setStatus("N");

        //保存信息到数据库
        userDao.save(user);

        //发送邮箱给用户让用户进激活,后面doing...
        String content = "<a href='http://localhost/travel/activeUserServlet?code="+user.getCode()+"'>点击激活卓越旅游网</a> ";
        MailUtils.sendMail(user.getEmail(),content,"请激活你的卓越旅游网用户");


        return true;
    }

    @Override
    public User login(User user) {

        return  userDao.findUserByUsernameAndPassword(user.getUsername(),user.getPassword());
    }
}

UserDao

package com.hotdas.travel.dao;

import com.hotdas.travel.domain.User;

public interface UserDao {
    //根据用户名查询用户信息
    User findByUsername(String username);

    //保存用户信息
    void save(User user);

    //权限用户激活码用户
    User findByCode(String code);

    //激活
    void activeUser(User user);


    User findUserByUsernameAndPassword(String username, String password);
}

UserDaoImpl

package com.hotdas.travel.dao.impl;

import com.hotdas.travel.dao.UserDao;
import com.hotdas.travel.domain.User;
import com.hotdas.travel.util.JDBCUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

public class UserDaoImpl implements UserDao {

    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

    @Override
    public User findByUsername(String username) {
        User user =null;
        try {
            //1.定义sql
            String sql ="select * from tab_user where username=?";
            user = template.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),username);
        } catch (DataAccessException e) {
            e.printStackTrace();
        }
        return user;
    }

    @Override
    public void save(User user) {
        //1.定义sql
        String sql = "insert into tab_user(username,password,name,birthday,sex,telephone,email,status,code) values(?,?,?,?,?,?,?,?,?)";

        template.update(sql,
                user.getUsername(),
                user.getPassword(),
                user.getName(),
                user.getBirthday(),
                user.getSex(),
                user.getTelephone(),
                user.getEmail(),
                user.getStatus(),
                user.getCode());


    }

    //根据code查询用户
    @Override
    public User findByCode(String code) {
        User user = null;
        try {
            String sql = "select * from tab_user where code = ?";
            user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), code);
        } catch (DataAccessException e) {
            e.printStackTrace();
        }
        return user;
    }

    @Override
    public void activeUser(User user) {
        String sql = "update tab_user set status='Y' where uid=? ";
        template.update(sql,user.getUid());
    }

    @Override
    public User findUserByUsernameAndPassword(String username, String password) {
        User user =null;
        try {
            String sql="select * from tab_user where username=?  and password=?";
            user = template.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),username,password);
        } catch (DataAccessException e) {
            e.printStackTrace();
        }

        return user;
    }
}

 测试

 登录成功的效果

 

 

显示登录的用户信息

四、前端实现

修改header.html,添加登录状态style="display:none;和id="span_username"

<script>
    $(function () {
        $.post("findUserServlet",{},function (data) {
            var msg = "欢迎回来,"+data.name;
            $("#span_username").html(msg);
            $(".login").css("display","block");
        });
    });
</script>

<!-- 头部 start -->
    <header id="header">
        <div class="top_banner">
            <img src="images/top_banner.jpg" alt="">
        </div>
        <div class="shortcut">
            <!-- 未登录状态  -->
            <div class="login_out">
                <a href="login.html">登录</a>
                <a href="register.html">注册</a>
            </div>
            <!-- 登录状态  -->
                <div class="login" style="display:none;">
            	
                <span id="span_username">欢迎回来,admin</span>
                <a href="myfavorite.html" class="collection">我的收藏</a>
                <a href="javascript:;">退出</a>
            </div>
        </div>
        <div class="header_wrap">
            <div class="topbar">
                <div class="logo">
                    <a href="/"><img src="images/logo.jpg" alt=""></a>
                </div>
                <div class="search">
                    <input name="" type="text" placeholder="请输入路线名称" class="search_input" autocomplete="off">
                    <a href="javascript:;" class="search-button">搜索</a>
                </div>
                <div class="hottel">
                    <div class="hot_pic">
                        <img src="images/hot_tel.jpg" alt="">
                    </div>
                    <div class="hot_tel">
                        <p class="hot_time">客服热线(9:00-6:00)</p>
                        <p class="hot_num">400-618-9090</p>
                    </div>
                </div>
            </div>
        </div>
    </header>
    <!-- 头部 end -->
     <!-- 首页导航 -->
    <div class="navitem">
        <ul class="nav">
            <li class="nav-active"><a href="index.html">首页</a></li>
            <li><a href="route_list.html">门票</a></li>
            <li><a href="route_list.html">酒店</a></li>
            <li><a href="route_list.html">香港车票</a></li>
            <li><a href="route_list.html">出境游</a></li>
            <li><a href="route_list.html">国内游</a></li>
            <li><a href="route_list.html">港澳游</a></li>
            <li><a href="route_list.html">抱团定制</a></li>
            <li><a href="route_list.html">全球自由行</a></li>
            <li><a href="favoriterank.html">收藏排行榜</a></li>
        </ul>
    </div>
    

五、后端的实现

 FindUserServlet

package com.hotdas.travel.web.servlet;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.hotdas.travel.domain.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/findUserServlet")
public class FindUserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        User user = (User)request.getSession().getAttribute("user");

        ObjectMapper objectMapper = new ObjectMapper();
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/json;charset=utf-8");
        String userStr = objectMapper.writeValueAsString(user);
        response.getWriter().write(userStr);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

测试

 

用户退出

六、前端的实现

登录用session存储用户信息,当session清除,用户的登录状态就消息.

实现:编写ExitServlet用于清除session即可

修改header.html

<!-- 登录状态  -->
<div class="login" style="display:none;">
   
    <span id="span_username">欢迎回来,admin</span>
    <a href="myfavorite.html" class="collection">我的收藏</a>
    <a href="javascript:location.href='exitUserServlet';">退出</a>
</div>

七、后端实现

package com.hotdas.travel.web.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/exitUserServlet")
public class ExitUserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取session进行销毁
        request.getSession().invalidate();
        //跳转到登录页面
        response.sendRedirect(request.getContextPath()+"/login.html");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

测试

 退出有一下划线,点击退出跳转首页如下

 

八、遇到的bug

 1.登录功能的bug

代码没有报错,但是怎么都登录不上,修改了pom.xml的端口号,重新运行,就解决了

2.退出功能的bug

是前端网页跳转的路径写错了

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lambda-小张

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

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

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

打赏作者

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

抵扣说明:

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

余额充值