栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2.登陆退出功能开发

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2.登陆退出功能开发

登陆退出功能开发 1、登陆功能开发 1.1、创建MVC结构

登陆网址:http://localhost:8080/backend/page/login/login.html

1、创建员工实体类Employee

package com.itheima.reggie.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;

import java.io.Serializable;
import java.time.LocalDateTime;


@Data
public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    private String username;

    private String name;

    private String password;

    private String phone;

    private String sex;

    private String idNumber; // 身份证号码

    private Integer status;

    private LocalDateTime createTime;

    private LocalDateTime updateTime;

    @TableField(fill = FieldFill.INSERT)
    private Long createUser;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;

}

2、创建MVC目录:controller、service、service.impl、mapper

3、创建EmployeeMapper

package com.itheima.reggie.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itheima.reggie.entity.Employee;
import org.apache.ibatis.annotations.Mapper;


@Mapper
public interface EmployeeMapper extends BaseMapper {
}

4、创建EmployeeService

package com.itheima.reggie.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.reggie.entity.Employee;


public interface EmployeeService extends IService {
}

5、创建EmployeeServiceImpl

package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.entity.Employee;
import com.itheima.reggie.mapper.EmployeeMapper;
import com.itheima.reggie.service.EmployeeService;
import org.springframework.stereotype.Service;


@Service
public class EmployeeServiceImpl extends ServiceImpl implements EmployeeService {
}

6、创建EmployeeController

package com.itheima.reggie.controller;

import com.itheima.reggie.service.EmployeeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;
}
1.2、创建返回值类R

创建common目录,在该目录下创建R

用于给前端返回信息,将所需要传递的信息都封装为R对象

package com.itheima.reggie.common;

import lombok.Data;

import java.util.HashMap;
import java.util.Map;


@Data
public class R {

    private Integer code; //编码:1成功,0和其它数字为失败

    private String msg; //错误信息

    private T data; //数据

    private Map map = new HashMap(); //动态数据

    public static  R success(T object) {
        R r = new R();
        r.data = object;
        r.code = 1;
        return r;
    }

    public static  R error(String msg) {
        R r = new R();
        r.msg = msg;
        r.code = 0;
        return r;
    }

    public R add(String key, Object value) {
        this.map.put(key, value);
        return this;
    }

}
1.3、在controller中创建登陆方法

创建login方法,路径:com/itheima/reggie/controller/EmployeeController.java

@PostMapping("/login")
public R login(HttpServletRequest request, @RequestBody Employee employee) {
    // 1. 将页面提交的密码password进行md5加密处理,相同的字符串经过MD5加密后的结果相同
    String password = employee.getPassword();
    password = DigestUtils.md5DigestAsHex(password.getBytes());

    // 2. 根据页面提交的用户名username查询数据库
    LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(Employee::getUsername, employee.getUsername());
    Employee emp = employeeService.getOne(queryWrapper); // username字段唯一

    // 3. 如果没有查询到则返回登录失败结果
    if (emp == null) {
        return R.error("登录失败");
    }

    // 4. 密码对比。如果不一样则返回登录失败结果
    if (!emp.getPassword().equals(password)) { // 如果数据库中的密码和传入的参数密码不一样
        return R.error("登录失败");
    }

    // 5. 查看员工状态,如果为已禁用状态,则返回员工已禁用结果
    if (emp.getStatus() == 0) {
        return R.error("账号已禁用");
    }

    // 6. 登录成功,将员工id存入session并返回登录成功结果
    request.getSession().setAttribute("employee", emp.getId());
    return R.success(emp); // 把从数据库中查到的emp存入R中
}
1.4、调试超时解决

修改request.js文件里的timeout参数,路径:backend/js/request.js

2、退出功能开发

点击退出按钮后,发送请求到后端,后端清除session中的用户id并返回success

2.1 创建退出方法

在EmployeeController中创建logout方法,路径:com/itheima/reggie/controller/EmployeeController.java

@PostMapping("/logout")
public R logout(HttpServletRequest request) {
    request.getSession().removeAttribute("employee");
    return R.success("退出成功");
}
3、拦截未登录用户

若员工未登录则禁止访问index首页,返回到登陆页面。

实现方法:

  1. 创建自定义过滤器LoginCheckFilter
  2. 在启动类上加入注解@ServletComponentScan
  3. 完善过滤器的处理逻辑
3.1、创建Filter

创建目录filter,在该目录下创建LoginCheckFilter类

在前端request.js文件中的响应拦截器是根据res.data.code和res.data.msg判断是否需要回到登陆页面,所以后端里的拦截器如果拦截了某个请求需要回写一个R传给前端作判断。

package com.itheima.reggie.filter;

import com.alibaba.fastjson.JSON;
import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@Slf4j
@WebFilter(filterName = "loginCheckFilter", urlPatterns = "
    public boolean check(String[] urls, String requestURI) {
        for (String url : urls) {
            boolean match = PATH_MATCHER.match(url, requestURI);
            if (match) {
                return true;
            }
        }
        return false;
    }
}
3.2、在主启动类添加@ServletComponentScan

3.3、测试拦截器

首页地址:http://localhost:8080/backend/index.html

登陆地址:http://localhost:8080/backend/page/login/login.html

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/981513.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号