目录
登录功能是web开发中常见的功能,也是学后端必须要练得一个功能,本次的登录功能相对完善一些,知识拦截器部分写的比较少,这部分提供给大家思考和完善相应的功能。这个功能已达到毕设的水准,基本知识点都是按照毕设的常用的知识点去编写的。
创建接口UserMapper并实现MP的基本步骤。
- @Repository
- public interface UserMapper extends BaseMapper
{ - }
创建登录所需的方法。
- public interface UserService {
- // 登录
- User login(String username, String password);
- }
将Controller层传过来的用户名和密码先进行对密码使用MD5进行加密(数据库表存储的密码是加密后的密文,以保证用户密码的安全性),然后在进行MP的条件查询访问数据库查询该用户名和密码的用户。
- @Service
- public class UserServiceImpl implements UserService {
- @Autowired
- private UserMapper userMapper;
- @Override
- public User login(String username, String password) {
- //加密
- String passwordWithMd5 = MD5Util.md5(password);
-
- //根据用户名和加密之后的密码从数据库查询用户
- //select * from user where username = ? and password = ?
- LambdaQueryWrapper
wrapper=new LambdaQueryWrapper(); - wrapper.eq(User::getUsername,username)
- .eq(User::getPassword,passwordWithMd5);
- //返回查询结果
- return userMapper.selectOne(wrapper);
- }
- }
对登录进行判断是否登录成功,给前端返回Map集合{“code”,"0"}为登录失败返回的内容。Map集合{“code”,"1"}为登录成功返回的内容。登录成功需要用JWT技术返回一个令牌(token)。
- @RestController
- public class UserController {
- @Autowired
- private UserService userService;
- Map
map=new HashMap<>(); - // 登录
- @RequestMapping("/admin/user/login")
- public Map
login(String username,String password){ - User user=userService.login(username,password);
- if(user==null){//登录失败
- map.put("code","0");
- }else {//登录成功
- HashMap
tokenMap = new HashMap(); - tokenMap.put("id", user.getId());
- String token = JwtUtil.createToken(tokenMap);
- map.put("token",token);
- map.put("code","1");
- }
- return map;
- }
- }
JWT 技术创建token、解析token代码。
- //JWT的生成和解析
- public class JwtUtil {
- // 创建token
- public static String createToken(Map claims) {
- return Jwts.builder()
- .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24))//设置有效时间为1天
- .setClaims(claims) //设置响应数据体
- .signWith(SignatureAlgorithm.HS256, "heima_movies") //设置加密方法和加密盐
- .compact();
- }
-
- // 解析token
- public static Map parseToken(String token) {
- return Jwts.parser().setSigningKey("heima_movies")
- .parseClaimsJws(token)
- .getBody();
- }
- }
访问拦截器时查看上面的token是否存在,存在则用户登录成功状态放行,否则禁止通行返回401状态码。
- //访问拦截器
- @Component
- public class LoginInterceptor implements HandlerInterceptor {
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- try {
- String token = request.getHeader("token");//从请求头获取token
- Map map = JwtUtil.parseToken(token);
- BeanUtil.mapToBean(map, Member.class, true);
- return true;//放行
- } catch (Exception e) {
- response.setStatus(401);
- return false;//禁止通行,返回401状态码
- }
- }
- }
拦截器需拦截的内容和放行的路径设置。将管理员部分路径拦截不让普通用户访问。
- @Configuration
- public class ManagerConfig implements WebMvcConfigurer {
-
- @Autowired
- private LoginInterceptor loginInterceptor;
-
- //设置拦截器
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- //定义放行路径
- ArrayList
urls = new ArrayList<>(); - urls.add("/**/*.js");//管理系统静态资源
- urls.add("/**/*.css");//管理系统静态资源
- urls.add("/**/*.jpg");//管理系统静态资源
- urls.add("/**/*.png");//管理系统静态资源
- urls.add("/**/*.html");//管理系统静态资源
- urls.add("/admin/user/login");//管理系统登录请求
- urls.add("/admin/user/logout");//管理系统退出请求
-
- //配置拦截器和路径
- registry.addInterceptor(loginInterceptor)
- .addPathPatterns("/admin/**")//拦截所有
- .excludePathPatterns(urls); //放行指定路径
- }
- }
登录页,在不输入用户名和密码访问路径http://localhost:8080/index.html会跳转到登录页面,被拦截器拦截,

输入正确的用户名和密码后跳转到主页面。

f12查看token存在的位置和值(这也是有令牌才可正常进入主功能页面)

基于SpringBoot+MP+VUE的登录功能的实现考虑的相对全面,可作为毕设的参考。但VUE方面的代码在这里没有展示。想要了解的可以自己学学Vue知识点,主要还是JWT技术的运用。还有后端的代码逻辑的分析。