文章目录
1 登录
1.1 新建JsonResult类来封装返回客户端的JSON 数据格式
util包里新建JsonResult类,这个类,用来封装返回客户端的JSON 数据格式
package com.qst.util;
/*
这个类,用来封装返回客户端的JSON 数据格式
*/
public class JsonResult {
private int state;//表示状态 0 表示失败 1 表示成功
private String message;//表示返回客户端的消息
private Object data;//表示封装具体的数据返回给客户端
public JsonResult() {
}
public JsonResult(int state, String message, Object data) {
this.state = state;
this.message = message;
this.data = data;
}
public JsonResult(int state, String message) {
this.state = state;
this.message = message;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public String getMessage() {
return message;
}
//将类业务层的异常信息 可以通过e.getMessage(); 给 message属性赋值
public void setMessage(Throwable e) {
this.message = e.getMessage();
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
1.2 异常处理
1.2.1 业务层异常处理类ServiceException
exception包里新建类
package com.qst.exception;
//ServiceException 业务层异常
public class ServiceException extends RuntimeException{
public ServiceException() {
super();
}
public ServiceException(String message) {
super(message);
}
public ServiceException(String message, Throwable cause) {
super(message, cause);
}
public ServiceException(Throwable cause) {
super(cause);
}
protected ServiceException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
1.2.2 全局异常处理类DoControllerExceptionHandler
exception包里新建类
package com.qst.exception;
import com.qst.util.JsonResult;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
//全局异常处理类
@ControllerAdvice //用这个注解修饰的类就是异常处理类
public class DoControllerExceptionHandler {
@ExceptionHandler(Exception.class)//指定能处理的异常类型
@ResponseBody
public JsonResult controllerExceptionHandler(Exception e){
return new JsonResult(0,e.getMessage());
}
}
1.3 检查登录用户名
1.3.1 前端
给表单内username加上 id = “username”
username下加上span标签 id="sp1"显示用户名是否被占用
JS语句:
<script>
//当页面加载完成后
$(function () {
//检查登录用户名
checkLoginUserName();//有括号页面加载完成后立马执行
});
//实现登录用户名检查
function checkLoginUserName() {
//给用户名输入框添加失去焦点事件
$("#username").blur(function () {
//获取用户输入的值 <span>江苏</span>
var username=$("#username").val();
if(username==null||username===''){
alert("请输登录用户名");
return;
}
//发起送ajax的请求 $.post();
$.post("/user/checkLoginUserName",{"username":username},function(data){
if (data.state==1){
$("#sp1").html(data.message);
$("#sp1").css("color","green");
}else {
$("#sp1").html(data.message);
}
},"json");
});
}
</script>
1.3.2 后端实现
发起送ajax的请求 $.post(),通过注解跳转到后台 “/user/checkLoginUserName”
在UserController类里:
//检查login的用户名
@PostMapping("/checkLoginUserName")
@ResponseBody//{"state":1,"message":"用户名验证通过","data":{"uid":1,"username":""}}
public JsonResult checkLoginUserName(String username){
System.out.println(username);
User user = userService.checkLoginUserName(username);
return new JsonResult(1,"用户名验证通过",user);
}
具体在业务层接口userService类的checkLoginUserName方法里实现
//检查login的用户名
User checkLoginUserName(String username);
在继承了业务层接口UserService的业务层UserServiceImpl类里实现
@Override
public User checkLoginUserName(String username) {
if(username==null ||StringUtils.isEmpty(username)){
throw new ServiceException("登录名不能为空");
}
//根据用户名查询当前用户是否存在
User user = userMapper.checkName(username);
if(user==null){
throw new ServiceException("当前用户没有注册");
}
return user;
}
用户模块持久层接口userMapper类里的checkName(username)方法,与mappers里的UserMapper.xml里的数据库语句通过 id=“checkName” 映射,之后返回user。JsonResult类返回客户端的JSON数据里,状态 state =1表示成功,通过判断,前端span 标签显示用户名是否被占用。
1.4 执行登录
1.4.1 前端
$(function ()里添加doLogin()函数,没有括号页面加载完成后触发事件执行
JS语句:
//登录
function doLogin() {
//点击事件
$("#loginBtn").click(function(){
//获取表单数据
var username=$("#username").val();
var password=$("#password").val();
var param={"username":username,"password":password};
//发送ajax请求
$.post("/user/doLogin",param,function(data){
if(data.state==1){
alert(data.message);
//跳到首页
location.href="/user/index";
}else{
alert(data.message);
}
},"json");
});
}
1.4.2 后端实现
发起送ajax的请求 $.post(),通过注解跳转到后台 “/user/doLogin”
在UserController类里:
//处理登录
@PostMapping("/doLogin")
@ResponseBody
public JsonResult doLogin(String username, String password, HttpServletRequest request){
User user = userService.login(username, password);
System.out.println(user);
//将user 对象 的 uid 保存session 中
HttpSession session = request.getSession();
session.setAttribute("uid",user.getUid());
return new JsonResult(1,"登录成功",user);
}
具体在业务层接口userService类的login方法里实现
//用户登录
User login(String username,String pwd);
在继承了业务层接口UserService的业务层UserServiceImpl类里实现 login 方法
@Override
public User login(String username, String pwd) {
//参数判断
if(username==null||"".equals(username)){
throw new ServiceException("登录名不能为空");
}
if(pwd==null||"".equals(pwd)){
throw new ServiceException("登录密码不能为空");
}
//根据用户名找当前用户
User user1 = userMapper.checkName(username);
//获取注册时的密码和盐值
String salt=user1.getSalt();
//String password=user1.getPassword();
//将登录的密码和盐值进行加密 再与password 比对
String md5PWD = getMd5PWD(pwd, salt);//加密后的密码
//根据用户名和密码查询当前用是否存在
User user = userMapper.findUserByUserNameAndPassword(username, md5PWD);
System.out.println("user:"+user);
if(user==null){
throw new ServiceException("当前用户数据不存在");
}else{
if(user.getIsDelete()==1){//说明
throw new ServiceException("数据可能被删除");
}
if(!user.getPassword().equals(md5PWD)||!username.equals(user.getUsername())){
throw new ServiceException("用户名或者密码错误!");
}
return user;
}
}
根据用户名和密码查询当前用户功能里,用户模块持久层接口userMapper类里的findUserByUserNameAndPassword方法,与mappers里的UserMapper.xml里的数据库语句通过 id=“findUserByUserNameAndPassword” 映射
//根据用户名和密码查询当前用户
/*
在mybatis如果持久层的接口传的是两个以上的参数,建议使用@Param("参数名") 将这个参数名
对应的参数值获取到赋值给对应的字段
*/
User findUserByUserNameAndPassword(@Param("username") String username,
@Param("password") String password);
<!--根据用户名和密码查询当前用户-->
<select id="findUserByUserNameAndPassword" resultType="User">
select uid,username,password,salt,is_delete isDelete from tb_user
where username=#{username} and password=#{password}
</select>
最后返回user,JsonResult类返回客户端的JSON数据里,状态 state =1表示成功,跳到首页 location.href="/user/index"
到后端在UserController类里:
//跳转到首页
@GetMapping("/index")
public String toIndex(){
return "web/index";
}