瑞吉外卖项目
第二天:
1.登录操作
- 在EmployeeController类,编写登录代码。
完善登录操作。
//1、将页面提交的密码password进行md5加密处理
String password=employee.getPassword();password=DigestUtils.md5DigestAsHex(password.getBytes());
//2、根据页面提交的用户名username查询数据库
LambdaQueryWrapper
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
3、启动项目,测试拦截器是否有用。
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、在浏览器中进行测试。
*美好的一天又结束了,下次继续努力!*
还没有评论,来说两句吧...