Java TokenProcessor令牌校验工具类

Java TokenProcessor令牌校验工具类

简介

Java TokenProcessor令牌校验工具类是一种防止重复提交的实现方式。当用户请求一个需要重复提交的页面时,我们需要判断用户是否重复提交或者在多次刷新保存过程中多次提交。这时我们可以使用 TokenProcessor 工具类来生成 token,将其储存到会话中或者隐藏表单中以供验证用户提交数据的合法性。

使用方法

引入依赖

在项目的 pom.xml 文件中引入以下依赖:

<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
</dependency>

编写 TokenProcessor 工具类

TokenProcessor 工具类需要实现生成 token 和验证 token 两个方法,代码如下:

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.UUID;

public class TokenProcessor {
    private static final Log log = LogFactory.getLog(TokenProcessor.class);

    /**
     * 生成 token 并放入 session 中
     * @param request HttpServletRequest 对象
     * @return token 字符串
     */
    public static String generateToken(HttpServletRequest request){
        String token = null;
        try {
            HttpSession session = request.getSession(false);
            if (session!=null){
                token = UUID.randomUUID().toString();
                session.setAttribute("token",token);
            }
        } catch (Exception e) {
            log.error("generate token failded: ",e);
        }
        return token;
    }

    /**
     * 校验 token 是否一致
     * @param request HttpServletRequest 对象
     * @param token token 字符串
     * @return true 表示校验通过,false 表示校验不通过
     */
    public static boolean isValidate(HttpServletRequest request, String token){
        HttpSession session = request.getSession(false);
        if (session == null){
            return false;
        }
        String sessionToken = (String) session.getAttribute("token");
        if (StringUtils.isEmpty(sessionToken)){
            return false;
        }
        if (!sessionToken.equals(token)){
            return false;
        }
        //验证通过后销毁token
        session.removeAttribute("token");
        return true;
    }
}

在页面中新增 Token 标签

在表单中新增一个隐藏的 input 标签,用于保存 token 字符串,代码如下:

<form action="http://xxxxxxx" method="POST">
    <input type="hidden" name="token" value="${token}">
    <!--其他表单项-->
    <button type="submit">提交</button>
</form>

向用户端生成 Token

在 Controller 中生成 token 字符串,并保存至会话中供后续验证,代码如下:

@Controller
@RequestMapping(value = "/xx")
public class ExampleController {

    @RequestMapping(value = "/example",method = RequestMethod.GET)
    public String example(HttpServletRequest request){
        String token = TokenProcessor.generateToken(request);
        request.setAttribute("token",token);
        return "/example.jsp";
    }

    @RequestMapping(value = "doSomething",method = RequestMethod.POST)
    public String doSomething(HttpServletRequest request,@RequestParam String token){
        //校验token是否有效
        boolean isValidate = TokenProcessor.isValidate(request,token);
        if (isValidate){
            //处理业务代码
        }else {
            //处理异常情况
        }
        return "redirect:/xx/example";
    }
}

示例说明

示例一:生成 Token

String token = TokenProcessor.generateToken(request);

在用户访问“/xx/example”的请求时,调用 TokenProcessor 的 generateToken() 方法生成一个 token 字符串,并将其保存在会话中。代码执行后会返回一个 token 字符串。将其保存在 Model 中,通过 jsp 页面渲染隐藏表单项,让用户浏览器保存 token 值。

示例二:校验 Token

boolean isValidate = TokenProcessor.isValidate(request,token);

在用户提交表单时,将 token 值传入到处理方法中,在处理方法中调用 TokenProcessor 的 isValidate() 方法,传入 request 和 token 值进行校验,校验通过则进行正常的业务处理,否则需要跳转到错误页面等相关操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java TokenProcessor令牌校验工具类 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • 详解SpringCloud微服务架构之Hystrix断路器

    详解SpringCloud微服务架构之Hystrix断路器 简介 Hystrix是Netflix开源的一款容错框架,用于提高分布式系统的弹性和可用性。SpringCloud对Hystrix进行了集成,提供了Hystrix的监控与管理功能,方便用户对微服务架构中的服务进行容错处理。 Hystrix的作用 在微服务的架构中,一个服务的宕机或者响应时间过长都会导致…

    人工智能概览 2023年5月25日
    00
  • 完美处理python与anaconda环境变量的冲突问题

    针对这个问题,我会提供一份完整的攻略。 1. 什么是环境变量? 在深入讲解这个问题之前,我们首先需要了解一下什么是“环境变量”。环境变量可以理解为是全局变量,可以在不同的程序中被调用。在操作系统中,每个进程都有自己的一组环境变量。 在Windows系统中,我们可以通过“控制台 > 系统和安全 > 系统 > 高级系统设置 > 环境变量”…

    人工智能概览 2023年5月25日
    00
  • VS2019下opencv4.1.2配置图文教程(永久配置)

    下面我将为您详细讲解“VS2019下opencv4.1.2配置图文教程(永久配置)”。 简介 OpenCV是一个计算机视觉库,可以用于图像处理和计算机视觉任务。在Visual Studio环境下安装和配置OpenCV是一个常见的任务,由于环境的不同,存在很多种方法进行配置。本文将介绍使用VS2019在Windows操作系统下,利用最新版本的OpenCV(4.…

    人工智能概论 2023年5月24日
    00
  • iOS判断身份证号码是否正确的方法

    iOS判断身份证号码是否正确的方法 在iOS开发中,判断身份证号码是否正确是非常常见的需求。它涉及到身份证号码的规则校验和部分解析。以下是判断身份证号码是否正确的方法: 校验规则 首先,我们需要了解身份证号码的校验规则。根据国家标准《GB 11643-1999》规定,身份证号码共计18位,其中前17位为地区码和出生日期码,第18位为校验位。其中,校验位的计算…

    人工智能概论 2023年5月25日
    00
  • 如何利用nginx处理DDOS进行系统优化详解

    如何利用Nginx处理DDOS进行系统优化详解 DDOS攻击,全称为分布式拒绝服务攻击,是指攻击者利用大量计算机或设备,通过特定的手段攻击目标服务器,使其无法正常工作,导致服务不可用。为了防范DDOS攻击,我们可以利用Nginx来进行系统优化。 配置Nginx限制连接速率 在Nginx配置文件中,我们可以通过配置limit_conn和limit_req模块来…

    人工智能概览 2023年5月25日
    00
  • html+ajax实现上传大文件功能

    实现上传大文件功能可以采用前端html和ajax技术相结合的方式来实现。具体步骤如下: 1. 相关依赖库的引入 我们需要在html页面中引入jquery和fileupload插件,代码示例如下: <!– 引入jquery –> <script src="https://cdn.bootcss.com/jquery/3.3.1/…

    人工智能概览 2023年5月25日
    00
  • Django 多对多字段的更新和插入数据实例

    以下是关于Django多对多字段更新插入数据的完整攻略。 什么是多对多字段 在Django的ORM中,多对多字段代表了一种模型关系,允许两个模型的实例都可以有零个或多个关联对象。例如,一个学生可以加入多个俱乐部,而同样一个俱乐部也可以拥有多个学生。这种情况下,Django的ORM提供了多对多字段来实现多对多关系的维护。多对多字段允许一个模型实例与多个模型实例…

    人工智能概览 2023年5月25日
    00
  • iOS14新功能有哪些 iOS14新功能介绍

    iOS 14新功能介绍 iOS 14是苹果公司发布的最新操作系统版本,带来了许多新功能和改进。在本文中,我将对iOS 14的新功能进行详细介绍,包括以下几个方面: 主屏幕小部件 iOS 14最引人注目的新功能之一是主屏幕小部件。现在,你可以将小部件添加到主屏幕上,以便更快地访问最常用的应用程序功能,无需打开应用程序。 例如,你可以在主屏幕上添加一个天气小部件…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部