本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1、当用户登陆成功后,我们需要保存用户的登陆信息在Session中
/*
* 员工登陆
* */
@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 **开启组件扫描
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;
}
}