ssm 使用token校验登录的实现

让我们来详细讲解一下“SSM 使用 Token 校验登录的实现”。

通过 Token 进行登录认证机制是常见的 Web 应用程序的身份认证机制之一。Token 是在身份验证后服务器返回的字符串,通常用于在客户端和服务器之间共享身份验证状态。以下是实现 SSM 使用 Token 校验登录的攻略:

1.概述

Token 认证机制主要分为以下几个流程:

  • 用户通过表单提交用户名和密码进行登录;
  • 服务器验证并生成 Token;
  • 将 Token 存储到数据库或缓存中,之后每次用户进行操作时通过 Token 进行验证;
  • 用户退出登录时清除对应 Token。

实现这个流程需要以下技术框架:

  • SpringBoot:简化 Spring 应用程序的创建和开发;
  • SpringSecurity:用于安全方面的功能,使用 Token 认证机制;
  • MyBatis:用于持久层操作;
  • MySQL:用于存储 Token。

2.建立用户登录

首先,我们需要建立用户登录功能,并将用户的信息保存到数据库中。

在后端代码中,我们应该提供一个接口来供前端界面调用。

以后端接口 /login 为例,代码如下:

@PostMapping(value = "/login")
public String login(@RequestParam final String username, @RequestParam final String password) {
    final User user = userService.getUserByName(username);
    if (user == null) {
        return "用户不存在";
    }
    if (!password.equals(user.getPassword())) {
        return "密码错误";
    }
    final String token = CreateToken.createToken(user);
    TokenUtil.storeToken(token, user);
    return token;
}

在这个代码片段中,我们通过用户提交的用户名和密码从数据库中查询用户信息,如果查询到用户信息,则生成一个 Token,并将 Token 和用户信息存储起来。最后,我们返回给前端 Token。

3.验证 Token

我们需要编写一个验证 Token 的拦截器,用于从接口中提取 Token,并将其和存储在服务器中的 Token 进行比较。

/secure/ 接口为例,实现代码如下:

@Configuration
public class SecurityConfig extends WebMvcConfigurerAdapter {

    @Autowired
    private TokenInterceptor tokenInterceptor;

    @Override
    public void addInterceptors(final InterceptorRegistry registry) {
        registry.addInterceptor(tokenInterceptor);
    }
}
public class TokenInterceptor implements HandlerInterceptor {

    @Autowired
    private UserService userService;

    @Override
    public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object o) throws Exception {
        final String requestToken = request.getHeader("token");
        final User user = TokenUtil.getUser(requestToken);
        if (user != null) {
            final String localToken = TokenUtil.getToken(user);
            if (localToken != null && localToken.equals(requestToken)) {
                return true;
            }
        }
        response.setContentType("application/json;charset=utf-8");
        try (final PrintWriter writer = response.getWriter()) {
            final ResultDto resultDto = new ResultDto();
            resultDto.setCode(ResultCodeEnum.TOKEN_ERROR.getCode());
            resultDto.setMessage(ResultCodeEnum.TOKEN_ERROR.getMessage());
            final ObjectMapper objectMapper = new ObjectMapper();
            final String json = objectMapper.writeValueAsString(resultDto);
            writer.write(json);
            writer.flush();
        }
        return false;
    }
}

在这个代码片段中,我们重写了 HandlerInterceptor 类,并在其中调用了验证 Token 的方法。具体来说,从请求中提取了所包含的 Token,根据 Token 在服务器中查询与之对应的用户信息,将用户信息和本地存储中的 Token 进行比较。如果 Token 正确,则返回 true;否则,返回错误代码和错误信息。

4.清除 Token

最后,我们需要提供一个接口,用于清除用户的 Token,实现代码如下:

@GetMapping(value = "/logout")
public String logout(@RequestParam final String token) {
    TokenUtil.deleteToken(token);
    return "退出成功";
}

在这个代码片段中,我们只需根据提供的 Token 找到并移除本地存储中的 Token 即可。

5.示例

下面给出两个示例,并说明它们的实现过程。

示例 1

前端代码:

function login() {
    const username = document.getElementById("username").value;
    const password = document.getElementById("password").value;
    const xhr = new XMLHttpRequest();
    xhr.open('POST', '/login', true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && xhr.status === 200) {
            const token = xhr.responseText;
            sessionStorage.setItem("token", token);
            window.location.href = "/index";
        }
    };
    const params = {"username": username, "password": password};
    xhr.send(JSON.stringify(params));
}

后端代码:

@PostMapping(value = "/login")
public String login(@RequestBody final String jsonParam) {
    try {
        final JSONObject jsonObject = JSONObject.parseObject(jsonParam);
        final String username = jsonObject.getString("username");
        final String password = jsonObject.getString("password");
        final User user = userService.getUserByName(username);
        if (user == null) {
            return "用户不存在";
        }
        if (!password.equals(user.getPassword())) {
            return "密码错误";
        }
        final String token = CreateToken.createToken(user);
        TokenUtil.storeToken(token, user);
        return token;
    } catch (Exception ex) {
        return "登录失败";
    }
}

在前端代码中,我们定义了一个函数,在用户单击“登录”按钮时被调用。这个函数获取用户输入的用户名和密码,并通过 AJAX 向服务器发送 POST 请求。在 HTTP 头中包含了 "Content-Type" 为 "application/x-www-form-urlencoded",并将参数转换为 JSON 字符串发送到服务器。在服务器端,我们接收到 JSON 请求,解析其内容并查询与之对应的用户信息。如果用户名和密码均正确,则生成一个 Token,并存储 Token 和用户信息。最后,我们将 Token 返回给前端界面。

示例 2

前端代码:

$(function () {
    $.ajax({
        url: "/secure/user",
        type: "GET",
        async: false,
        beforeSend: function (request) {
            request.setRequestHeader("token", sessionStorage.getItem("token"));
        },
        success: function (response) {
            if (response.code === "OK") {
                $("#user").text(response.data.username);
            } else {
                $("#user").text("未登录");
            }
        },
        error: function () {
            $("#user").text("未登录");
        }
    });
})

后端代码:

@GetMapping(value = "/user")
public ResultDto user(final HttpServletRequest request) {
    final String requestToken = request.getHeader("token");
    final User user = TokenUtil.getUser(requestToken);
    return ResultDto.success(user);
}

在前端代码中,我们使用 AJAX 发送带有 Token 的 GET 请求到 "/secure/user" 接口。在 HTTP 头中包含了 "token" 为 sessionStorage 中获取到的 Token。在服务器端,我们通过获取请求头中包含的 Token 进行身份校验,如果通过身份认证,则返回一个包含了当前用户信息的 JSON 对象。

6.总结

以上就是实现 SSM 使用 Token 校验登录的完整攻略,通过实现 Token 认证机制,我们可以保证用户信息和登录状态的安全性,并能够使用 Token 在客户端和服务器之间共享身份验证状态。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ssm 使用token校验登录的实现 - Python技术站

(0)
上一篇 2023年6月16日
下一篇 2023年6月16日

相关文章

  • gradle和maven有哪些区别

    Gradle和Maven是两个流行的Java构建工具,虽然它们都可以用于构建Java(和其他)应用程序,但它们在某些方面有所不同。在本文中,我们将深入探讨两者之间的不同点,以便您了解它们的共同点和差异。 1. 什么是Gradle和Maven? Maven Maven是一种基于XML的构建工具,用于管理Java项目的构建、依赖关系和发布。Maven使用传递性依…

    Java 2023年5月20日
    00
  • java获取IP归属地全网显示开源库使用

    获取IP归属地是许多Web开发、网络安全等领域的必备技能,实现这一功能需要使用到一些开源的库。本文将介绍Java获取IP归属地全网显示开源库的使用方法,包含如下内容: IP归属地库的选择 库的安装和配置 如何使用库获取IP归属地 示例说明 IP归属地库的选择 在Java中获取IP归属地需要使用第三方库,常见的库有GeoLite2和ip2region等。这些库…

    Java 2023年5月26日
    00
  • 一文带你学会Spring JDBC的使用

    一文带你学会Spring JDBC的使用 简介 Spring JDBC是基于JDBC的框架,它提供了许多方便的功能去简化JDBC编码的繁琐。它可以自动管理连接、传播事务,同时提供了一种直观且简洁的方式去执行SQL语句,Spring JDBC已成为了Java应用程序中访问数据库的首选。本文将介绍如何使用Spring JDBC去连接数据库、执行SQL查询与更新,…

    Java 2023年5月19日
    00
  • 教你用Java GUI实现文本文件的读写

    教你用Java GUI实现文本文件的读写 如果你想在Java图形用户界面(GUI)中实现文本文件的读写,可以按照以下步骤操作: 1. 创建GUI界面 首先,需要创建一个GUI界面,让用户可以输入和查看文件的内容。可以使用Swing或JavaFX等GUI框架来创建GUI界面。 以下是一个简单的使用JavaFX创建GUI界面的示例代码: import javaf…

    Java 2023年5月20日
    00
  • MyBatis注解方式之@Update/@Delete使用详解

    MyBatis注解方式之@Update/@Delete使用详解 MyBatis提供了很多注解来使用SQL语句,其中@Update和@Delete注解可以用来更新和删除数据库中的记录。下面我们详细讲解一下这两种注解的使用方法。 @Update注解使用方法 @Update注解可以用来更新数据库中的记录。它有以下几种使用方式: 方式一:简单方式 @Update(&…

    Java 2023年5月20日
    00
  • java使用正则表达式查找包含的字符串示例

    关于Java使用正则表达式查找包含的字符串示例,可以按照以下步骤进行: 步骤一:创建Pattern对象 为了使用正则表达式,需要首先创建一个Pattern对象。可以使用Pattern类提供的静态方法compile()来实现,如下所示: Pattern pattern = Pattern.compile("要查找的正则表达式"); 正则表达…

    Java 2023年5月27日
    00
  • Springboot项目平滑关闭及自动化关闭脚本

    下面是详细讲解“Spring Boot 项目平滑关闭及自动化关闭脚本”的完整攻略: 什么是 Spring Boot 项目平滑关闭? Spring Boot 项目平滑关闭是指在关闭 Spring Boot 项目时会先等待当前请求处理完成再关闭应用程序。这样可以保证处理请求的过程不被中断。 如何实现 Spring Boot 项目平滑关闭? 使用 actuator…

    Java 2023年5月20日
    00
  • java实用验证码的实现代码

    针对“java实用验证码的实现代码”的完整攻略,我将以下面几个部分进行详细讲解: 验证码介绍:了解什么是验证码以及它的作用。 验证码实现思路:介绍如何实现验证码的代码。 验证码实现示例:提供两个示例说明。 1. 验证码介绍 验证码全称为“Completely Automated Public Turing test to tell Computers and…

    Java 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部