用户登录代码实现步骤

用户登录代码实现步骤

1 配置过滤器,判断用户未登录时,哪些资源可以访问,以及判断用户是否登录

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;

@WebFilter(filterName = "LoginCheckFilter")
@Slf4j
public class LoginCheckFilter implements Filter {
    // 将需要放行的路径放到一个数组中
    private String[] authUrl = new String[]{
            "/employee/login",
            "/employee/logout",
            "/backend/**",
            "/front/**"
    };

    /**
     * 判断访问的路径是否在authUrl路径数组中
     *
     * @param requestUrl
     * @return
     */
    public boolean checkAuthUrl(String requestUrl) {
        // spring提供的一个路径匹配器
        AntPathMatcher matcher = new AntPathMatcher();
        //遍历数组中数据,判断访问路径是否符合条件
        for (String url : authUrl) {
            if (matcher.match(url, requestUrl)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 路径符合条件,放行的方法
     *
     * @param req
     * @param resp
     * @param chain
     * @throws ServletException
     * @throws IOException
     */
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        // 想要调用http协议相关的方法 ,需进行向下转型
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        // 拿到访问路径
        String requestURI = request.getRequestURI();
        log.info("[拦截的请求路径:]" + requestURI);
        // 判断该路径是否在数组中
        boolean isAuth = checkAuthUrl(requestURI);
        //在数组中,放行
        if (isAuth) {
            log.info("[白名单路径放行]");
            chain.doFilter(request, response);
            return;
        }
        // 如果不在,判断用户是否登录,已登录放行
        if (request.getSession().getAttribute("employee") != null) {
            log.info("[用户已经登录放行]");
            chain.doFilter(request, response);
            return;
        }
        log.info("[该资源需要登录后访问,未登录无权限]");
        // web 如果想把一个对象--json格式 给前端 需要怎么做
        //把登录失败信息对象 转换成json
        //把转换后的json数据封装 流中 传递给浏览器
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
    }
}

2 往表现层的类中写入login登录方法:判断用户账号和密码是否正确,判断成功后,将对象存入共享区域,避免在一次会话中多次登录

添加业务层属性,实现依赖管理,方便调用
@Autowired
private EmployeeService employeeService;

/**
 * 员工登录方法
 * @param employee
 * @param request
 * @return
 */
@PostMapping("/login")
public R<Employee> login(@RequestBody Employee employee, HttpServletRequest request) {
     //查看传入的员工对象信息
    log.info("[员工登录:employee:{}]", employee);
    // 获取员工对象的密码
    String password = employee.getPassword();
    // 对密码加密
    password = DigestUtils.md5DigestAsHex(password.getBytes());
    // 获取查询条件的对象
    LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();
    //往查询对象中加入查询条件(员工对象的账户)
    wrapper.eq(Employee::getUsername, employee.getUsername());
    //在数据库中查询
    Employee emp = employeeService.getOne(wrapper);

    // 先判断员工信息是否为null
    if (emp == null) {
        return R.error("用户名或者密码错误,请重新登录");
    }

    // 判断员工密码是否正确
    if (!emp.getPassword().equals(password)) {
        return R.error("用户名或者密码错误,请重新登录");
    }

    // 对用户登录状态进行判断
    if (emp.getStatus() == 0) {
        return R.error("该账号已被禁用,请找老板");
    }
    // 把用户id存入共享区域session中
    request.getSession().setAttribute("employee", emp.getId());
    // 返回查询出来的员工对象
    return R.success(emp);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值