1.分析

登录与退出功能是整个项目中最简单的功能,实现这两个功能,基本只要思路理好了,代码就随便写了,根据我的项目总结:

1.登录功能的思路基本如下:

①. 将页面提交的密码password进行md5加密处理, 得到加密后的字符串

②. 根据页面提交的用户名username查询数据库中员工数据信息

③. 如果没有查询到, 则返回登录失败结果

④. 密码比对,如果不一致, 则返回登录失败结果

⑥. 登录成功,将员工id存入Session, 并返回登录成功结果

2.登录过滤器的基本思路如下:

首先创建一个loginFilter类实现Filter接口,其次,我们实现doFilter方法,接下来就理清自己的思路:

A.获取本次请求的URI
B. 判断本次请求, 是否需要登录, 才可以访问
C. 如果不需要,则直接放行
D. 判断登录状态,如果已登录,则直接放行
E. 如果未登录, 则返回未登录结果

2.代码实现

1.登录功能代码实现

@PostMapping("/login")
    public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee){

        //①. 将页面提交的密码password进行md5加密处理, 得到加密后的字符串
        String password = DigestUtils.md5DigestAsHex(employee.getPassword().getBytes());
        //②. 根据页面提交的用户名username查询数据库中员工数据信息
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Employee::getUsername, employee.getUsername());
        Employee em = employeeService.getOne(queryWrapper);
        //③. 如果没有查询到, 则返回登录失败结果
        if(em == null){
            return R.error("登录失败");
        }
        //④. 密码比对,如果不一致, 则返回登录失败结果
        if(!password.equals(em.getPassword())){
            return R.error("登录失败");
        }
        //⑤. 查看员工状态,如果为已禁用状态,则返回员工已禁用结果
        if(em.getStatus() == 0){
            return R.error("该用户已被禁用");
        }
        //⑥. 登录成功,将员工id存入Session, 并返回登录成功结果
        request.getSession().setAttribute("employee",em.getId());
        return R.success(em);
    }


    /**
     * @ClassName EmployeeController
            * @Description :退出登录
            * @Return : com.itheima.reggie.common.R<java.lang.String>
            * @Author : xmc
            * @Date : 2022/5/21 14:09
    */
    @PostMapping("/logout")
    public R<String> logout(HttpServletRequest request){
        request.getSession().removeAttribute("employee");
        return R.success("退出成功");
    }

2.登录过滤器

@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {
    
    public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher(); 
    
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        //获取本次请求地址
        String requestURI = request.getRequestURI();
        log.info("拦截到路径{}",request);

        //配置不需要拦截的地址
        String[] url = new String[]{
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**"
        };
        //比较
        boolean check = this.check(url, requestURI);
        if(check){
            filterChain.doFilter(servletRequest,servletResponse);
            return;
        }
        if(request.getSession().getAttribute("employee") != null){
            filterChain.doFilter(servletRequest,servletResponse);
            return;
        }
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        return;
    }

    public boolean check(String[] urls,String requestURI){
        for (String url : urls) {
            if(PATH_MATCHER.match(url,requestURI)){
                return true;
            }
        }
        return false;
    }

3.总结

这里是简单的登录功能实现,思路理清是实现功能的前提!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐