第二天:
1.登录操作
- 在EmployeeController类,编写登录代码
- 完善登录操作。
//1、将页面提交的密码password进行md5加密处理 String password=employee.getPassword(); password=DigestUtils.md5DigestAsHex(password.getBytes()); //2、根据页面提交的用户名username查询数据库 LambdaQueryWrapper<Employee> queryWrapper= new LambdaQueryWrapper<>(); queryWrapper.eq(Employee::getUsername,employee.getUsername()); Employee emp=employeeService.getOne(queryWrapper); //3、如果没有查询到则返回登录失败结果 if (emp==null){ return R.error("登录失败"); } //4、密码比对,如果不一致则返回登录失败结果 if (!emp.getPassword().equals(password)){ return R.error("登录失败!"); } //5、查看员工状态,如果为已禁用状态,则返回员工已禁用结果 if (emp.getStatus()==0){ return R.error("账号已禁用!"); } //6、登录成功,将员工id存入Session并返回登录成功结果 request.getSession().setAttribute("employee",emp.getId()); return R.success(emp);
3.debug进行调试。
4.编写退出操作代码。
//员工退出 @PostMapping("/logout") public R<String> logout(HttpServletRequest request){ //清理Session中保存的当前员工登录id request.getSession().removeAttribute("employee"); return R.success("退出成功·!"); }
2.完善登录功能
问题分析:
用户如果不登录,直接访问系统首页面,照样可以正常访问。这种设计并不合理,我们希望看到的效果应该是,只有登录成功后才可以访问系统中的页面,如果没有登录则跳转到登录页面。
解决办法:
使用过滤器或者拦截器,在过滤器或者拦截器中判断用户是否已经完成登录,如果没有登录则跳转到登录页面。
实现步骤:
1、创建自定义过滤器LoginCheckFilter,在reggie下创建Filter包,创建LoginCheckFilter类。
//检查用户是否已经完成登录 @Slf4j @WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*") public class LoginCheckFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request=(HttpServletRequest) servletRequest; HttpServletResponse response=(HttpServletResponse) servletResponse; log.info("拦截请求:{}",request.getRequestURI()); filterChain.doFilter(request,response); } }
2、在启动类上加入注解@ServletComponentScan。
@ServletComponentScan
启动项目,测试拦截器是否有用。
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@415004ff] 2023-03-04 10:02:12.002 INFO 8124 --- [nio-8080-exec-2] c.i.reggie.filter.LoginCheckFilter : 拦截请求:/backend/js/request.js 2023-03-04 10:02:12.133 INFO 8124 --- [nio-8080-exec-3] c.i.reggie.filter.LoginCheckFilter : 拦截请求:/backend/plugins/axios/axios.min.map 2023-03-04 10:02:12.282 INFO 8124 --- [nio-8080-exec-4] c.i.reggie.filter.LoginCheckFilter : 拦截请求:/backend/plugins/axios/axios.min.map 2023-03-04 10:02:12.308 INFO 8124 --- [nio-8080-exec-5] c.i.reggie.filter.LoginCheckFilter : 拦截请求:/employee/page 2023-03-04 10:02:12.308 WARN 8124 --- [nio-8080-exec-5] o.s.web.servlet.PageNotFound : No mapping for GET /employee/page 2023-03-04 10:02:21.000 INFO 8124 --- [nio-8080-exec-6] c.i.reggie.filter.LoginCheckFilter : 拦截请求:/employee/page 2023-03-04 10:02:21.001 WARN 8124 --- [nio-8080-exec-6] o.s.web.servlet.PageNotFound : No mapping for GET /employee/page
4、完善过滤器的处理逻辑。
代码实现
过滤器具体的处理逻辑如下:
1、获取本次请求的URI
2、判断本次请求是否需要处理
3、如果不需要处理,则直接放行
4、判断登录状态,如果已登录,则直接放行
5、如果未登录则返回未登录结果
//检查用户是否已经完成登录 @Slf4j @WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*") 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、获取本次请求的URI String requestURI=request.getRequestURI(); log.info("拦截到请求:{}",requestURI); //定义不需要处理的请求路径 String[] urls=new String[]{ "/employee/login", "/employee/logout", "/backend/**", "/front/**" }; // 2、判断本次请求是否需要处理 boolean check=check(urls,requestURI); // 3、如果不需要处理,则直接放行 if (check){ log.info("本次请求不需要处理",requestURI); filterChain.doFilter(request,response); return; } // 4、判断登录状态,如果已登录,则直接放行 if (request.getSession().getAttribute("employee")!=null){ log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employee")); filterChain.doFilter(request,response); return; } log.info("用户未登录"); // 5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据 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){ return true; } } return false; } }
5、在浏览器中进行测试。
*美好的一天又结束了,下次继续努力!*