Java TokenProcessor令牌校验工具类

yizhihongxing

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日

相关文章

  • pytorch 中的重要模块化接口nn.Module的使用

    在PyTorch中,开发人员主要使用nn.Module模块来构建神经网络模型。 nn.Module提供了许多有用的内置方法和属性,使得从头开始构建复杂的模型在可读性和使用上更加容易。接下来将介绍nn.Module的使用方法,以及在此模块的帮助下如何实现一个简单的神经网络模型。 nn.Module的基本功能 nn.Module是所有神经网络模型的基本构建块,在…

    人工智能概论 2023年5月25日
    00
  • 如何使用bootstrap框架 bootstrap入门必看!

    如何使用 Bootstrap 框架 什么是 Bootstrap? Bootstrap 是一款由 Twitter 公司设计和开发的前端开发框架,它采用了 HTML、CSS、JavaScript 等技术,为开发者提供了大量的、可复用的 UI 组件和样式,使开发工作更加便捷和高效。 如何使用 Bootstrap? 步骤一:下载 Bootstrap 在开始使用 Bo…

    人工智能概览 2023年5月25日
    00
  • Windows server 2016服务器基本设置

    下面是“Windows Server 2016 服务器基本设置”的完整攻略。 1. Windows Server 2016 安装设置 1.1 下载 Windows Server 2016 镜像文件,刻录成光盘或 USB 启动盘。 1.2 将光盘或 USB 启动盘插入需要安装 Windows Server 2016 的服务器电脑上。 1.3 按下电脑开机键,选…

    人工智能概览 2023年5月25日
    00
  • java程序员自己的图片转文字OCR识图工具分享

    我可以为您提供Java程序员自己的图片转文字OCR识图工具分享的完整攻略。下面是具体的步骤: Step 1:安装Tesseract OCR引擎 Tesseract OCR是Google开源的OCR引擎,可以进行文字识别,Java程序员可以将其封装成Java调用库。在开始这个工具的开发之前,我们需要先安装Tesseract OCR引擎。具体的安装步骤可以参考T…

    人工智能概览 2023年5月25日
    00
  • Python利用Faiss库实现ANN近邻搜索的方法详解

    Python利用Faiss库实现ANN近邻搜索的方法详解 Faiss是一款Facebook AI Research开发的专门用于高效向量检索的库,可以实现范围内搜索和最近邻搜索等功能。本文将详细讲解如何使用Python中的Faiss库实现ANN近邻搜索。 安装 在开始使用Faiss之前,你需要先安装Faiss库。可以使用如下命令进行安装: pip insta…

    人工智能概览 2023年5月25日
    00
  • 使用PM2+nginx部署python项目的方法示例

    我将为您提供一份“使用PM2+nginx部署python项目的方法示例”的完整攻略,其中包含了详细的步骤说明和两个示例。 前置条件 在开始前,请确保您的环境已经安装好了以下软件: Node.js PM2 Nginx 同时,您也需要一份 Python 项目代码。 步骤一:安装配置PM2 在命令行中执行以下命令安装 PM2: npm install pm2 -g…

    人工智能概览 2023年5月25日
    00
  • 在Debian11上安装Openresty服务(Nginx+Lua)的详细教程

    下面是在Debian 11上安装OpenResty服务(Nginx+Lua)的详细教程: 安装系统依赖 在开始安装OpenResty之前,需要先安装一些系统依赖。具体命令如下: sudo apt update && sudo apt upgrade #更新软件包 sudo apt install curl gcc libreadline-de…

    人工智能概览 2023年5月25日
    00
  • Ubuntu18.04安装opencv 3.2.0的解决方法

    下面是Ubuntu18.04安装opencv 3.2.0的解决方法攻略: 一、安装依赖项 首先,要安装一些基本依赖项。在终端中执行以下命令: sudo apt-get update sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev li…

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