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;
}