1.登录功能实现逻辑:
先查询数据空中是否有这个用户名,没有的话直接返回登录失败
有这个用户名,再检查密码对不对,密码不对直接返回登录失败
employee表有一个字段是status,这个字段表示这个用户是不是被封号了,被封号了也要返回一个结果给浏览器
实现:
@PostMapping("/login")
public R<Employee> login(HttpServletRequest request,@RequestBody Employee employee)
{
//拿到用户输入的密码employee.password
String password=employee.getPassword();
//对密码进行MD5加密处理
password=DigestUtils.md5DigestAsHex(password.getBytes());
//拿到用户输入的户名employee.username,查询数据库中是否有这个用户名
LambdaQueryWrapper<Employee> queryWrapper=new LambdaQueryWrapper<Employee>();
queryWrapper.eq(Employee::getUsername,employee.getUsername());
Employee emp=employeeService.getOne(queryWrapper);//emp就是从数据库中查出来的对象
//数据库中是否有这个用户
if(emp==null)
{
return R.error("登陆失败");
}
//密码比对不一致
if(emp.getPassword().equals(password)==false)
{
return R.error("登陆失败");
}
//查看员工状态,0表示被封号
if(emp.getStatus()==0)
{
return R.error("账号被封");
}
//登录成功,将员工id存入到Session里,并且返回登录成功后的结果
request.getSession().setAttribute("employee",emp.getId());
return R.success(emp);
}
但是这样还存在一个问题:用户如果不登陆,直接输入网址,也可以访问到一些本来需要登录才能访问到的页面,我们想要实现的是:有些页面不要登录就能访问,有些页面需要登才能访问,没有登陆输入网址想要访问就跳转到登录页面
如何实现:使用过滤器或者拦截器,在过滤器或者拦截器中判断用户是否已经完成登录,如果没有登录就跳转到登录页面
//检查用户是否已经登录
//第一个参数表示给过滤器起名字,第二个参数表示对哪些url请求进行拦截(这里是所有url进行拦截)
@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
{
HttpServletResponse response=(HttpServletResponse) servletResponse;
HttpServletRequest request=(HttpServletRequest) servletRequest;
//拿到本次请求的URI
String requestURI=request.getRequestURI();
log.info("拦截到请求:{}",requestURI);
//以下url直接放行
String[] urls=new String[]{"/employee/login","/employee/logout","/backend/**","/front/**"};
//判断访问这个url是否需要判断登录,不用检查就直接放行
boolean check=check(urls,requestURI);
if(check==true)
{
log.info("本次请求{}不需要处理",requestURI);
filterChain.doFilter(request,response);//放行
return;
}
//看看用户是否已经登录
if(request.getSession().getAttribute("employee")!=null)//已经登陆了,就直接放行
{
log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employee"));
filterChain.doFilter(request,response);//放行
return;
}
//如果没有登录
log.info("用户未登录");
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
return;
}
//检查本次请求是否需要放行
public boolean check(String[] urls,String requestURI)
{
for(String url:urls)
{
boolean match=PATH_MATCHER.match(url,requestURI);
if(match==true)
{
return true;
}
}
return false;
}
}
2.退出功能实现:
点击右上角的退出按钮,发送请求,请求地址是/employee/logout 请求方式位POST
就可以退出登录,跳转到登陆页面
@RequestMapping("/logout")
public R<String> logout(HttpServletRequest request)
{
//清理Session中保存的当前登录员工的id
request.getSession().removeAttribute("employee");
return R.success("退出成功");
}