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日

相关文章

  • java实现多线程卖票功能

    下面是Java实现多线程卖票功能的完整攻略。 1. 线程安全性 在多线程环境中,相同的资源可能被多个线程同时访问,因此必须保证线程安全性。Java提供了多种方式来实现线程安全性,包括使用synchronized关键字、使用Lock接口、使用Atomic类等。 2. 实现多线程卖票 为了实现多线程卖票功能,我们可以创建多个线程来模拟多个售票窗口,并且使用同一组…

    Java 2023年5月18日
    00
  • 详解Java中的实例初始化块(IIB)

    针对您提供的问题,我将按照以下步骤来进行回答: IIB(Instance Initialization Block)是什么? 为什么要使用IIB? IIB的语法格式和执行顺序是什么? IIB的示例说明 1. IIB是什么? IIB全称为Instance Initialization Block,即实例初始化块。它是Java类中的一个代码块,用来初始化实例变量…

    Java 2023年5月26日
    00
  • Spring Boot 定制与优化内置的Tomcat容器实例详解

    Spring Boot 定制与优化内置的 Tomcat 容器实例详解 前言 Spring Boot 是目前非常流行的 Java Web 开发框架。在 Spring Boot 中,内置了 Tomcat 容器,方便开发者快速搭建 Web 应用,然而默认配置下的 Tomcat 可能不太满足实际的需求。那么,如何对 Spring Boot 中的 Tomcat 进行定…

    Java 2023年5月19日
    00
  • Java实战之图书管理系统的实现

    Java实战之图书管理系统的实现攻略 介绍 图书管理系统是一个广受欢迎的Java项目,本文主要介绍如何使用Java语言实现一个图书管理系统,并分为以下几个步骤: 设计数据库 创建项目 实现前端界面 实现后台逻辑 测试和部署 设计数据库 图书管理系统需要设计一个数据库,用来存储图书信息和用户信息。我们可以使用MySQL数据库,并创建两个表,一个是图书信息表,另…

    Java 2023年5月19日
    00
  • java调用oracle分页存储过程示例

    这是一个详细讲解“java调用oracle分页存储过程”的攻略,我们会带你一步一步完成该过程。 1. 确认是否已配置好Oracle驱动和Java开发环境 在开始前,我们需要确认Java运行环境是否已正确安装,并添加了Oracle的JDBC驱动。如果还没有安装的话,请先自行下载与配置。 2. 创建Oracle分页存储过程 我们需要在Oracle数据库中创建一个…

    Java 2023年6月1日
    00
  • 一个简单Ajax类库及使用方法实例分析

    一、Ajax类库简介 在前端开发领域,使用Ajax技术实现无页面刷新的异步通信已经成为常态。然而,原生的XmlHttpRequest对象并不友好,需要手写大量冗长的代码,因此,我们通常会使用现成的Ajax类库来简化开发流程。 下面,我们来介绍一种简单的Ajax类库——jQuery。这是一款功能强大、易于上手的JavaScript库,它封装了一系列针对DOM操…

    Java 2023年6月15日
    00
  • Java中mybatis的三种分页方式

    Java中mybatis的分页方式有以下3种: 使用MySQL的Limit语句进行分页: 在Mapper接口中定义方法 public List<User> findByPage(@Param("startIndex") int startIndex, @Param("pageSize") int pageS…

    Java 2023年5月20日
    00
  • org.apache.ibatis.binding.BindingException异常报错原因以及详细解决方案

    先给一下org.apache.ibatis.binding.BindingException异常的概述: BindingException是MyBatis中的绑定异常,当Mapper接口和Mapper映射文件出现错误时抛出。在MyBatis中,Mapper接口和Mapper映射文件是对应绑定的,如果Mapper接口方法的参数、返回值类型或SQL语句等配置错误…

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