通过Web三大组件之一的过滤器来处理用户登陆判断

128 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1、当用户登陆成功后,我们需要保存用户的登陆信息在Session中

image.png

/*
* 员工登陆
* */
@PostMapping("/login")
public R<Employee> login(@RequestBody Employee employee, HttpServletRequest request){

    String username = employee.getUsername();
    String password = employee.getPassword();
    password = DigestUtils.md5DigestAsHex(password.getBytes());
    LambdaQueryWrapper<Employee> queryWrapper=new LambdaQueryWrapper<>();
     queryWrapper.eq(Employee::getUsername, username);
    Employee one = employeeService.getOne(queryWrapper);
    if (one==null){
        return R.error("用户名不正确");
    }
    String onePassword = one.getPassword();
    if (!onePassword.equals(password)){
        return R.error("密码错误");
    }
    Integer status = one.getStatus();
    if (status==0){
        return R.error("该员工账户已经被禁用");
    }
    request.getSession().setAttribute("employee",one.getId());
    return R.success(one);

}

2、对进行登陆、退出的请求(包括静态资源和api资源)给与放行,我们这里采用的是Web三大组件之一的Filter过滤器来进行拦截请求

2.1 AntPathMatcher 拓展:

介绍: Spring中提供的路径匹配器 ;

通配符规则:

符号含义
?匹配一个字符
*匹配0个或多个字符
**匹配0个或多个目录/字符

2.2 **开启组件扫描

image.png

2.3 定义一个过滤器,通过获取请求的URL、和需要放行的URL、资源以及当前会话中存放的Id,进行是否拦截该请求。

package com.ligong.filter;


import com.alibaba.fastjson.JSON;
import com.ligong.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(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;


        //1、获取本次请求的Url地址

        String requestURI = request.getRequestURI();

        //定义不需要处理的请求路径

        String[] noHandleUrl=new String[]{
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**" 
        };
        
        //2、判断本次请求是否要进行处理
        
        boolean chek=check(requestURI,noHandleUrl);

        //如果是登陆、退出等资源请求进行放行
        if (chek){
            filterChain.doFilter(request,response);
            return;
        }

        //3、判断是否登陆过,如果登陆过,直接放行
       Long empId= (Long) request.getSession().getAttribute("employee");
        if (empId!=null){
            filterChain.doFilter(request,response);
        }
        log.info("用户----------没有进行登陆");

        //4.用户没有进行登陆,那么响应给前端页面
        response.getWriter().write(JSON.toJSONString(R.error("没有进行登陆")));

        return;

    }
    /*
    * 判断当前请求的路径信息是否为步需要过滤的请求
    * */
    private boolean check(String requestURI, String[] noHandleUrl) {

        for (String url : noHandleUrl) {
            boolean match = PATH_MATCHER.match(url, requestURI);
            if (match) return true;
        }
        return false;
        
    }
}