文章目录
用户登录代码实现步骤
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);
}