用户管理模块之用户登录

用户管理模块之用户登录

开发顺序

  1. 持久层
  2. 业务层
  3. 控制层
  4. 页面

cn.tedu.store.mapper中新建UserMapper.java接口

  • 由于在用户管理模块之用户注册已经创建了,所以不用新建了

功能

  1. 验证用户名是否存在,其中返回的是用户对象,这个在前面的注册已经定义过了,是User selectUserByUserName(String userName)

cn.tedu.store.service创建IUserService接口和实现类UserServiceImpl

  • 由于在用户管理模块之用户注册已经创建了,所以不用新建了

功能

  1. 实现用户登录的业务,传入的参数是用户名密码

分析

  1. 用户登录输入的是用户名密码,登录不成功无非是是两种可能
    1. 用户名不存在,抛出异常提示
    2. 密码不匹配,抛出异常提示
  2. 用户登录User login(String userName,String passWord)`
    1. 通过selectUserByUserName返回user对象
    2. 判断user是否为null
    3. 如果user=null,抛出UserNotFoundException异常
    4. 如果user!=null,那么验证其中的密码是否正确
    5. 如果密码不匹配,抛出PassWordNotMatchException异常
    6. 如果密码匹配,那么返回user对象
  3. 抛出异常,当然需要有自己的异常类,在cn.tedu.store.service.ex中新建两个异常类
    1. 用户名不存在的异常UserNotFoundException,继承Exception,重写父类的构造方法
    2. 密码不匹配的异常PasswordNotMatchException,继承Exception,重写父类的构造方法

实现

  • IUserService接口中定义
/**
 * 实现登录的业务
 * @param userName  用户名
 * @param passWord  密码
 * @return  User对象
 * @throws UserNotFoundException  用户不存在的异常
 * @throws PassWordNotMatchException  密码不匹配的异常
 */
User login(String userName,String passWord) throws UserNotFoundException, PassWordNotMatchException;
  • UserServiceImpl实现类实现方法
/**
	 * 登录方法
	 * 1. 通过selectUserByUserName返回user对象
	 * 2.判断user是否为null
	 * 3.如果user=null,抛出UserNotFoundException异常
	 * 4.如果user!=null,那么验证其中的密码是否正确
	 * 5.如果密码不匹配,抛出PassWordNotMatchException异常
	 * 6. 如果密码匹配,那么返回user对象
	 * @throws UserNotFoundException 
	 * @throws PassWordNotMatchException 
	 */
	public User login(String userName, String passWord) throws UserNotFoundException, PassWordNotMatchException {
		
		User user=userMapper.selectUserByUserName(userName);  //根据用户名查询,返回user对象
		if (user==null) {   //user为null,表示用户名不存在
			throw new UserNotFoundException("用户名不存在");
		}else {  //如果用户名存在,验证密码
			if (passWord.equals(user.getPassword())) {  //如果密码匹配
				return user;   //返回user对象即可
			}else {   //如果密码不相同,那么直接抛出密码不匹配的异常即可
				throw new PassWordNotMatchException("密码不匹配");
			}
		}
	}
  • TestUser中测试
@Test
public void testLoginService() {
	// 加载Spring的配置文件,测试的业务层,因此需要spring-dao.xml和spring-service.xml配置文件
	AbstractApplicationContext ac = new ClassPathXmlApplicationContext(
			"spring-dao.xml", "spring-service.xml");

	IUserService userService = ac.getBean("userServiceImpl",
			IUserService.class);

	String username="陈加兵";
	String password="123456";
	try {
		User user=userService.login(username, password);
		System.out.println("用户登录成功");
	} catch (UserNotFoundException e) {
		System.out.println(e.getMessage());
	} catch (PassWordNotMatchException e) {
		System.out.println(e.getMessage());
	}
}

cn.tedu.store.controller中新建UserController

  • 由于之前新建过了,不需要在新建了

功能

  1. 显示登录页面
    1. /user/showLogin.do
  2. 处理登录的请求
    1. /user/login.do
    2. 请求参数:userNamepassword
    3. 请求方式POST
    4. 响应方式:ResposneBody

实现

  • 显示用户登录页面
/**
 * 显示登录视图 login.jsp
 * @return
 */
@RequestMapping("/showLogin.do")
public String showLogin() {
	return "login"; // 直接返回一个视图名称即可
}
  • 处理异步请求登录的方法
/**
 * 点击登录按钮处理异步请求的方法
 * @param username  用户名
 * @param password  密码
 * @param session  session域
 * @return  返回处理结果
 */
@RequestMapping("/login.do")
@ResponseBody
public ResponseResult<Void> login(String username,String password,HttpSession session){
	ResponseResult<Void> result=new ResponseResult<Void>();  //新建返回结果对象
	try {
		User user=userservice.login(username, password);  //调用service的login方法登录
		result.setState(1);   //设置响应状态码
		result.setMessage("登录成功");  //设置提示信息
		session.setAttribute("user",user);  //将user对象存放在session中
	} catch (UserNotFoundException e) { //用户名不存在的异常
		result.setState(0);   //设置响应状态码
		result.setMessage(e.getMessage());  //设置提示信息
	} catch (PassWordNotMatchException e) {   //密码不匹配的异常
		result.setState(0);   //设置响应状态码
		result.setMessage(e.getMessage());  //设置提示信息
	}
	return result;   //返回结果
}

login.jsp页面中添加异步请求

//点击登录按钮的方法
    $('#bt-login').click(function(){
        var username=$("#username").val();  //用户名
        var password=$("#password").val();  //密码
        var d={"username":username,"password":password};  //封装请求数据
        var url="<%=request.getContextPath()%>/user/login.do";  //请求地址
        //异步提交请求,进行验证
		$.post(url,d,function(data,status,xhr){
			//如果响应成功
			if(status=="success"){
				$("#showResult").text(data.message);  //显示提示信息
				//如果登录成功
				if(data.state==1){
					Save();  //调用save方法保存用户名和密码,保证后面自动登录
				   //跳转到首页index.jsp
                    window.location.href="<%=request.getContextPath()%>/main/showIndex.do";
					
				}else{  //登录没有成功
					$("#showResult").css("color","red");  //设置提示信息的文本颜色为红色
				}
			}
		});        
    });


 $(document).ready(function () {
        if ($.cookie("rmbUser") == "true") {
            $("#ck_rmbUser").attr("checked", true);
            $("#username").val($.cookie("username"));
            $("#password").val($.cookie("password"));
        }
    });

    //记住用户名密码,保存在cookie中
    function Save() {
        if ($("#ck_rmbUser").prop("checked")) {
            var str_username = $("#username").val();
            var str_password = $("#password").val();
            $.cookie("rmbUser", "true", { expires: 7 }); //存储一个带7天期限的cookie
            $.cookie("username", str_username, { expires: 7 });
            $.cookie("password", str_password, { expires: 7 });
        }
        else {
            $.cookie("rmbUser", "false", { expire: -1 });
            $.cookie("username", "", { expires: -1 });
            $.cookie("password", "", { expires: -1 });
        }
    };

总结

  1. 实现登录的时候,不可以使用用户名密码直接查询人数,因为sql是不区分大小写的,但是我们的密码是区分大小写的,比如select * from t_user where username=? and password=?,这个是不可以直接使用的,应该是使用用户名查询返回User对象,然后在比较用户输入的密码和对象中的密码是否相同:password.equals(user.getPassWord())
  2. 在需要修改前端页面的时候,不要大幅度的修改其中的css文件,可以使用内嵌式的样式修改即可

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习和数学

[编程经验] Python中的modlue和packages的区别

今天聊一下,Python中模块和包的区别和联系,以及怎么创建自己的package,通过学习,你可以明白我们平时用Python的时候,到底import 了什么东西...

2573
来自专栏林欣哲

汇编程序

ISA指令集是由0和1组成的机器语言,难以记忆和阅读,因此人们发明汇编程序帮助记忆。 汇编基本算是和机器指令一一对应的关系,可以认为是给机器指令的每个部分分别起...

3466
来自专栏cloudskyme

gsoap开发webservice

gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++w...

3326
来自专栏专注 Java 基础分享

初识Hibernate之理解持久化类

     上一篇文章我们简单介绍了Hibernate相关的一些最基本的文件及其作用,并在最后完整的搭建了Hibernate的运行环境,成功的完成了与数据库的映射...

1968
来自专栏用户3030674的专栏

GreenDao教程2

可以多次使用where(),进行多次筛选,也可以使用whereOr()语句,进行或语句查找

942
来自专栏小勇DW3

使用Redis作为分布式锁的一些注意点

最简单的方法是使用setnx命令。key是锁的唯一标识,按业务来决定命名,value为当前线程的线程ID。

2.8K5
来自专栏林欣哲

区块链开发之Go语言—文件系统

处理的文件名 path库 filepath库 查看文件的元信息 os.Stat os.Lstat 操作临时文件区域 os.TempDir os — 平台无关的操...

3878
来自专栏Aloys的开发之路

VIM常见用法总结

vim中光标如何回到上一次位置 ctrl + o vim如何删除某行至某行之间的内容? 删除3104至5403行之间的内容: :3104,5403d vim使光...

3536
来自专栏C/C++基础

C/C++头文件的作用和用法

示例代码编译运行环境:Windows 64bits+VS2017+Debug+Win32。

1101
来自专栏娱乐心理测试

如何在小程序wxml文件中编写js代码

WXS(WeiXin Script)是小程序的一套脚本语言,结合 WXML,可以构建出页面的结构。 wxs可以说就是为了满足能在页面中使用js存在的,在wxm...

933

扫码关注云+社区

领取腾讯云代金券