需求分析
点击登录按钮后,浏览器以POST方式向employee/login
提交username
和password
,服务器经过处理后向浏览器返回某种格式的数据,其中包含:
- code:登录状态码
- data:用户信息
- msg:失败原因
登录成功后点击退出按钮,清理session中的用户id,返回到登录页面
代码开发
创建实体类
创建实体类Employee,与数据库中的表employee进行映射,直接导入写好的java文件到entity目录
在
application.yml
中开启映射时的命名转换
导入返回结果类R
R是一个通用结果类,所有服务器返回的数据都包装为此种类型返回给前端。
controller、service与mapper
- controller调用ServiceImpl里封装好的方法为浏览器提供访问服务。
- service提供业务逻辑使用的方法,其实现在ServiceImpl中。
- mapper为ServiceImpl提供了操作数据的方法,具体实现的SQL语句在xml文件中。
login.html
valid是密码位数校验
通过校验后页面登录按钮显示为登陆中
下图为Spring框架将后端返回的R对象转成的json,返回到浏览器,也即下文的res
若res中code
为1,则表示登录成功,
将res的data转json存到localStorage中
如果登录失败,则提取res的msg显示在页面上。
数据流:
- 请求发送阶段:login.html 调用 loginApi 发送POST数据到路径 emloyee/login,配置注解 @RequestMapping 把访问 employee 的请求都给 EmployeeController 处理,内部再用 @PostMapping 注解,分配此POST数据给login方法处理。
- 数据处理阶段:login方法使用了 @RequestBody注解,自动解析传来的数据封装为一个employee对象。计算传来密码的MD5值,用Employee类初始化一个MyBatis中实现查询的封装类queryWrapper,即表示对employee对象进行查询,调用queryWrapper的eq方法,比较数据库中是否存在传来的用户名,调用MyBatis提供的Service方法,将查询结果封装为一个employee对象。
- 结果封装阶段:根据查询结果进行判断,将对应的状态码和提示封装到通用的结果返回对象R中,如果成功,则将员工ID放入session中。
- 结果返回阶段:Spring将R对象转json发送给前端,前端存到 localStorage 中,进行处理和显示。
过滤器防止非法访问
目前即使不登录也能访问到index.html,所以需要使用过滤器或者拦截器判断用户是否完成登录,未完成则转到login.html。
在项目文件夹 reggie 下新建包 filter,然后新建类 LoginCheckFilter.java实现 filter 接口,在类中加一个注解 @WebFilter(filterName=“loginCheckFilter”,urlPatterns=“/*”)
,/*
表示检查所有访问请求。
在启动类ReggieApplication.java上加一个注解 @ServletComponentScan
,启动时去扫描过滤器里的@WebFilter注解,即注册过滤器。
过滤时,先获取本次请求的URI,判断路径和状态作出响应,如果放行则调用doFilter方法放行,否则返回特定结果,由前端处理,,重定向到 login 页面。