spring mvc基于token防止重复提交验证

基于springMVC集成了Token,实现SSO,跨域访问的小框架介绍 毕竟在这之前,都是看别人的博客,站在巨人的肩膀上,我想这次也许我也应该分享一些自己的东西出来。废话不多说,直接来看怎么使用。首先将lingshi_base.jar的jar包引用到你的web工程中,当然需要提的是在这之前你需要在你的web工程上配置好springMVC,log4j这个我就不多说啦。1.集成Token的使用首先在web.xml中配置Token过滤器    <filter> ... 阅读详情

spring mvc基于token防止重复提交验证

实现思路:

在springmvc配置文件中加入拦截器的配置,拦截两类请求,一类是到页面的,一类是提交表单的。当转到页面的请求到来时,生成token的名字和token值,放入session,在页面表单的隐藏域显示。

当表单请求提交时,拦截器得到参数中的tokenName和token,然后到session中去取token值,如果能匹配上,请求就通过,不能匹配上就不通过。这里的token生成时也是随机的,每次请求都不一样。而从session中取token值时,会立即将其删除(删与读是原子的,无线程安全问题)。

一、首先创建一个token处理类  ,这里的类名叫 TokenHandler

package com.base.utils;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

/**
 * 创建时间:2017年4月5日 下午5:56:31 
 * 项目名称:tra02
 * 
 * @author hc
 * @version 1.0 
 * 文件名称:TokenHandler.java 
 * 类说明:
 */
public class TokenHandler {
	private static Logger logger = Logger.getLogger(TokenHandler.class);

	static Map<String, String> springmvc_token = null;

	// 生成一个唯一值的token
	@SuppressWarnings("unchecked")
	public synchronized static String generateGUID(HttpSession session) {
		String token = "";
		try {
			Object obj = session.getAttribute("SPRINGMVC.TOKEN");
			if (obj != null)
				springmvc_token = (Map<String, String>) session.getAttribute("SPRINGMVC.TOKEN");
			else
				springmvc_token = new HashMap<String, String>();
			token = new BigInteger(165, new Random()).toString(36).toUpperCase();
			springmvc_token.put(Constants.DEFAULT_TOKEN_NAME + "." + token, token);
			session.setAttribute("SPRINGMVC.TOKEN", springmvc_token);
			Constants.TOKEN_VALUE = token;
			// System.out.println(session.getAttribute("SPRINGMVC.TOKEN"));
		} catch (IllegalStateException e) {
			logger.error("generateGUID() mothod find bug,by token session...");
		}
		return token;
	}

	// 验证表单token值和session中的token值是否一致
	@SuppressWarnings("unchecked")
	public static boolean validToken(HttpServletRequest request) {
		String inputToken = getInputToken(request);

		if (inputToken == null) {
			logger.warn("令牌是不是有效的。inputtoken是空的");
			return false;
		}

		HttpSession session = request.getSession();
		Map<String, String> tokenMap = (Map<String, String>) session.getAttribute("SPRINGMVC.TOKEN");
		if (tokenMap == null || tokenMap.size() < 1) {
			logger.warn("token is not valid!sessionToken is NULL");
			return false;
		}
		String sessionToken = tokenMap.get(Constants.DEFAULT_TOKEN_NAME + "." + inputToken);
		if (!inputToken.equals(sessionToken)) {
			logger.warn("token is not valid!inputToken='" + inputToken + "',sessionToken = '" + sessionToken + "'");
			return false;
		}
		tokenMap.remove(Constants.DEFAULT_TOKEN_NAME + "." + inputToken);
		session.setAttribute("SPRINGMVC.TOKEN", tokenMap);

		return true;
	}

	// 获取表单中token值
	@SuppressWarnings("unchecked")
	public static String getInputToken(HttpServletRequest request) {
		Map params = request.getParameterMap();
		System.out.println(request.getSession().getAttribute("SPRINGMVC.TOKEN"));
		if (!params.containsKey(Constants.DEFAULT_TOKEN_NAME)) {
			logger.warn("无法找到令牌名称参数。");
			return null;
		}

		String[] tokens = (String[]) (String[]) params.get(Constants.DEFAULT_TOKEN_NAME);

		if ((tokens == null) || (tokens.length < 1)) {
			logger.warn("得到空或空的令牌名称。");
			return null;
		}
		String temp = tokens[0];
		String inputtoken = temp.substring(temp.indexOf("=") + 1, (temp.length()) - 1);
		return inputtoken;
	}
}

二、建立常量配置类Constabts

package com。base.utils;

/**
 * 创建时间:2017年4月5日 下午5:57:58 
 * 项目名称:traffic02
 * 
 * @author hc
 * @version 1.0 
 * 文件名称:Constants.java 
 * 类说明:
 */
public class Constants {
	
	public static String DEFAULT_TOKEN_MSG_JSP = "add.jsp";
	public static String TOKEN_VALUE;
	public static String DEFAULT_TOKEN_NAME = "springMVC.token";
	
}

三、前端页面 主要是隐藏域

<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
	<div align="center">
	<form action="user/add" method="post" >
	
	<input type="hidden" name="springMVC.token" value="<%=session.getAttribute("SPRINGMVC.TOKEN")%>" >
	名字:<input type="text" name="username">
	密码:<input type="password" name="password"/>
	<input type="submit" value="提交">
	</form>
	
	</div>
</body>
</html>

四、controller不用多写什么,能跳转举行

package com.traffic.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

/**  
* 创建时间:2017年4月5日 下午1:43:00  
* 项目名称:tra  
* @author hc  
* @version 1.0   
* 文件名称:UserController.java  
* 类说明:  
*/
@Controller
@RequestMapping("/user")
public class UserController {
	
	@RequestMapping("/toadd")
	public String toadd(Model model){
		
		return "forward:/add.jsp";
	}
	
	@RequestMapping("/add")
	public String add(String username,String password,Model model){
		
		System.out.println("suc");
		return "forward:/suc.jsp";
	}
}
 
五、重点是拦截器一个生成token,一个验证token。

public class TokenHandlerInterceptor implements HandlerInterceptor{
 
 
    public void afterCompletion(HttpServletRequest arg0,
            HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
    }
 
    public void postHandle(HttpServletRequest request, HttpServletResponse response,
            Object arg2, ModelAndView arg3) throws Exception {
        TokenHandler.generateGUID(request.getSession());
    }
 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
            Object arg2) throws Exception {
        return true;
    }
 
}
 
 
 
/**
 * @Title
 * @author 
 * @date 
 */
public class TokenValidInterceptor implements HandlerInterceptor{
 
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object arg2, Exception arg3)
            throws Exception {
    }
 
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
            Object arg2, ModelAndView arg3) throws Exception {
         
    }
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
            Object arg2) throws Exception {
        if(!TokenHandler.validToken(request)){
            response.sendRedirect(Constants.DEFAULT_TOKEN_MSG_JSP);
            return false;
        }
    return true;
    }
 
}

六、当然 springmvc要配置拦截器

<mvc:interceptor>
            <mvc:mapping path="/index.do" />-->这个请求返回的是你有token的页面
            <bean class="com.dengyang.interceptor.TokenHandlerInterceptor" />
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/indexSubmit.do" />-->这个是提交请求
            <bean class="com.dengyang.interceptor.TokenValidInterceptor" />
        </mvc:interceptor>
 

七、本方案如果不足之处,请大神们指教;

声明:本方案源于

http://www.oschina.net/code/snippet_100825_21906  

本人做了一些修改



S7-1200g2运动控制实战:从轴组配置到程序调试 本文详细介绍了S7-1200g2运动控制功能的实战应用,从轴组配置到程序调试的全流程。通过TIA Portal中的工艺对象配置,实现单轴、同步轴组等运动控制模型,并分享常见问题排查与性能优化经验,帮助工程师快速掌握中小型自动化设备的运动控制技术。 阅读详情

相关推荐

拆解人形机器人:核心硬件与驱动系统

本文深入解析人形机器人的核心硬件系统,将其类比为"骨骼+肌肉+神经"的集成体。重点介绍了三大关键组件:驱动单元(无框力矩电机和空心杯电机)、传动单元(谐波减速器和行星滚柱丝杠)以及感知单元(力矩传感器、编码器和IMU)。文章指出一体化关节模组正成为行业趋势,能够实现更紧凑的结构和更高的可靠性。同时分析了硬件价值量分布,强调丝杠、电机等部件是当前技术高地和成本重心。最后指出随着技术进步,机器人价值将更多向"大脑"和"神经"转移。

小明的博客 1529

springmvc中使用token来防止表单重复提交

今天在做注册页面的时候,碰到表单重复提交的问题。我就想到要使用模拟struts中的令牌机制来防止表单重复提交。         具体的实现过程是这样的:应为springmvc的控制器控制着页面的跳转或者重定向,所以在跳转到注册页面的时候, 创建一个token使用的是当前事件的long类型数字标识,能在一定范围内标识当前的值唯一性(当然 你也可以使用其他的标识方法比如随机数、系统的当前时间等等

dukangcheng的博客 4062

切比雪夫插值

切比雪夫插值是一种基于切比雪夫节点的多项式插值方法,其优势是减少插值误差(特别是龙格现象:表现为高维插值时在边缘处插值误差骤增)。本文对其基本操作进行说明。

平和少年的博客 1646

SpringMVC配置sa-Token

首先贴下官方文档,官方sa-token文档;看了一圈都是集成SpringBoot,我用bean注入看起来是先例哦哈哈,好咯,不跟你多bb,直接上代码 改applicationContext.xml(只有增加的哦) <!-- 加载配置文件 --> <context:property-placeholder location="classpath:redis.properties"/> <!-- Sa-Token--> <bean class=

好巧~我看到你了 4062

DataWorks PyODPS第三方包全攻略:从打包到加载的完整流程

本文详细介绍了在DataWorks的PyODPS节点中使用第三方Python包的完整流程,包括环境限制、打包工具pyodps-pack的使用、资源上传与加载实战,以及特殊场景处理技巧。通过本文,开发者可以掌握在MaxCompute受限环境中灵活使用自定义依赖的方法,提升数据处理效率。

dd012的博客 990

Spring Boot Admin 完整教程

SpringBootAdmin是一个用于管理和监控SpringBoot应用的Web工具,提供健康检查、性能指标、日志管理等核心功能。系统由AdminServer(管理服务器)和AdminClient(客户端)组成,通过Actuator端点收集数据。配置需添加Maven/Gradle依赖,通过@EnableAdminServer注解启动服务端,客户端需配置注册信息。支持UI自定义、安全认证(基本/OAuth2)、多种通知方式(邮件/Slack)及与Eureka/Consul等服务发现的集成。最佳实践包括分层监

weixin_51040479的博客 2555

项目集成sa-token

springboot项目集成sa-token

ang0406han的博客 1082

借助AI搞定国社科“研究内容”部分!用Gemini 3 Pro轻松撰写6大模块,让基金本子效率质量更上一层楼

所谓研究整体框架,是对课题研究逻辑结构与技术路径的系统阐述,其核心在于通过研究目标分解、研究内容模块化与研究方法整合,构建一个层次清晰、逻辑严密、科学可行的研究体系。撰写要求:1)分要点、分层次列出主要研究内容,保持各部分之间的逻辑性、层次性与系统性;研究可行性可理解为开展本课题在理论基础、研究方法、研究条件、人员结构、平台支撑及外部协作等方面的可实施程度,可从内部条件与外部条件两个维度进行系统论证。研究背景为:我正在申报xxx年xxx(项目名称),课题名称为:xxx,拟采用的主要研究方法包括:xxx等;

智能AI让学术科研更容易 964

Sa-token基本使用教程(全网最详细!!!)

Sa-Token登录认证权限认证Session会话单点登录OAuth2.0微服务网关鉴权等一系列权限相关问题。功能简单示例Sa-Token 的 API 设计非常简单,有多简单呢?以登录认证// 在登录时写入当前会话的账号id// 然后在需要校验登录处调用以下方法:// 如果当前会话未登录,这句代码会抛出 `NotLoginException` 异常权限认证示例(只有具备user:add权限的会话才可以进入请求)// ...return "用户增加";将某个账号踢下线。

可乐要加冰!!! 2万+

解锁Vscode:C/C++环境配置超详细指南

本文详细介绍如何在 VSCode 中配置 C/C++ 开发环境,帮助开发者快速搭建高效的编码调试环境。内容涵盖前期准备、软件下载安装、环境变量配置、工作区文件设置及测试运行全流程:首先需准备 VSCode 编辑器、MinGW-w64 编译器及 C/C++ 插件;接着完成工具下载与安装,配置系统环境变量以确保编译器可全局调用;然后通过创建.vscode工作区文件夹,配置核心文件,实现代码智能提示与调试功能;最后通过编写 Hello World 示例验证环境可用性,并附上常见问题排查方案。

邓邓子的博客 3047

Nexys4DDR+OV7670实现图像灰度显示系统嵌入式

通过对硬件平台的准备、Vivado工程配置、OV7670驱动程序的编写、图像灰度处理算法的设计以及系统集成与测试,我们成功实现了一个基于嵌入式系统的图像处理应用。当系统运行时,OV7670摄像头模块将采集到的图像传输到FPGA芯片中,然后通过图像灰度处理算法将彩色图像转换为黑白图像,并在显示设备上进行显示。OV7670摄像头模块的驱动程序是实现图像采集的核心。以上代码中,我们使用了Xilinx提供的XGpio和Xil_In32函数来进行OV7670摄像头数据的读取和GPIO的初始化。OV7670驱动程序。

WangWEel的博客 338

利用spring aop实现token 防止表单重复提交

struts里防止表单提交有现成的组件,但是spring mvc里没有现成的,需要自己实现。 代码还在优化,不过思路已经差不多了: 在你认为需要防止表单重复提交的form里加上 1,页面改动: 后台: 2,在你认为需要加token的业务方法上面注解:我使用的是基于注解+aop切面形式 @TokenNeeded() //这个注解自定义拦截自动往会话加入一个随机

2292

uniapp 如何封装实现任意页面都能使用的全局弹窗

项目内容场景全局监听消息提示难点uniapp 无法全局挂载组件解决方案动态创建 DOM + 动态 Vue 实例优势跨页面 / 不依赖页面组件树 / 灵活调用如果你使用的是小程序平台,DOM 操作可能受限,需要用或方式兼容处理。想支持多个弹窗堆叠?你可以扩展,加个弹窗队列管理器。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 944

Elasticsearch 7.6.0集群搭建实战:从head到Kibana汉化全攻略

在大规模日志检索场景中,单机Elasticsearch往往很快面临写入与查询性能瓶颈,分布式集群便成为提升扩展性与可用性的关键方案。Elasticsearch通过节点发现、主节点选举、分片分配等机制实现数据分布式存储,配合可视化工具Kibana可提供日志检索、指标监控与看板展示能力,而elasticsearch-head则适合快速巡检集群状态与索引分布。围绕集群架构设计、系统参数调优、核心配置解析、跨域访问处理等工程问题,本文完整梳理了一套三节点Elasticsearch 7.6.0集群从裸机环境到Kiba

weixin_34198453的博客 352

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

springmvc中自己实现的token防表单重复提交,防止二次提交

出处:http://www.oschina.net/code/snippet_100825_21906 一:首先创建一个token处理类  ,这里的类名叫 TokenHandler   private static Logger logger = Logger.getLogger(TokenHandler.class);       static Map springmvc_toke

徐小骥的博客 795

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

javaweb防重复提交的几种方式

本文针对javaweb项目中防止重复提交几种方式做简单整理。 重复提交场景: 点击提交按钮两次。 点击刷新按钮。 使用浏览器后退按钮重复之前的操作,导致重复提交表单。 使用浏览器历史记录重复提交表单。 浏览器重复的 HTTP 请求。 多人同时时间对同一笔单据进行操作。 方式一:通过JavaScript屏蔽提交按钮 通过js代码,当用户点击提交按钮后,屏蔽提交按钮使用户无法点击提交按钮或点击无效,从而实现防止表单重复提交。 ps:js代码很容易被绕过。比如用户通过刷新页面方式,或使用post

峪幽兰 的博客 1605

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

spring-mvc防止表单重复提交

拦截器代码:public class TokenInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exc

tangaoyu520hf的博客 987

Spring MVC防止数据重复提交(防止二次提交)

SpringMvc使用Token 使用token的逻辑是,给所有的url加一个拦截器,在拦截器里面用java的UUID生成一个随机的UUID并把这个UUID放到session里面,然后在浏览器做数据提交的时候将此UUID提交到服务器。服务器在接收到此UUID后,检查一下该UUID是否已经被提交,如果已经被提交,则不让逻辑继续执行下去… 首先要定义一个annotation: @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) .

小斐的专栏 509

小米多看电纸书互刷墨案系统:Rockchip刷机全流程与踩坑实录

电纸书刷机本质上是对嵌入式Linux/Android设备进行底层系统替换,其可行性与硬件平台高度相关。以Rockchip(瑞芯微)主控为例,Bootloader、内核及驱动层的兼容性决定了不同品牌系统能否互通。刷机过程中,USB驱动(如FT232R、CH340)的安装、RKDevTool等烧写工具的使用,以及Loader模式与Maskrom模式的进入,都是决定成败的关键环节。掌握这些基础技术,不仅能顺利完成固件升级,还能在设备变砖时通过底层镜像重写进行救砖。本文以小米多看电纸书互刷墨案系统为例,完整展示了从

weixin_34335458的博客 391

Spring MVC中防止Form重复提交

环境: UI:easyui、Spring3.0、hibernate3 问题:ajax封装spring form标记内所有标记、提交至inser.do或update.do方法、某些情况下(网络环境差)发生单据重复创建或重复执行统一方法数次。 要求:一个方法未执行完毕不允许再次提交表单、页面不跳转 status2做法:s:token标签加配拦截器 在Form创建前生成一个唯一编号放入Ses...

gjf450005950的专栏 310

SpringMVC 防止表单提交的解决方案

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34117522的博客 209

表单防重复提交拦截器

表单防重复提交http://blog.icoolxue.com/submitted-by-spring-mvc-to-prevent-data-duplication/

quwea123的博客 253

SpringMVC表当重复提交

最近公司上线,有同志进行攻击,表当防重复提交也没有弄,交给我 ,本人以前也没弄过,知道大概的思路,但是那样实在是太麻烦了,虽然后面试过使用过滤器加拦截器实现,不过还是有点小麻烦。 后来在网上搜索后发现不错的方案如下:注解加拦截器完成 首先创建注解token: @Target(ElementType.METHOD)@Retention(RetentionPol...

lkj_4720的博客 85

springmvc下的基于token的防重复提交

问题描述: 现在的网站在注册步骤中,由于后台要处理大量信息,造成响应变慢(测试机器性能差也是造成变慢的一个因素),在前端页面提交信息之前,等待后端响应,此时如果用户 再点一次提交按钮,后台会保存多份用户信息。为解决此问题,借鉴了struts2的token思路,在springmvc下实现token。 实现思路: 在springmvc配置文件中加入拦截器的配置,拦截两类请求,一类是到页面的,一

longyilalong的博客 240

java 防重_防重提交-开发思路

importjava.util.ArrayList;importjava.util.List;importjava.util.UUID;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;import...

weixin_39832875的博客 128
上一篇: mysql分页插件pagehelper初体验(详细)
下一篇: SpringMVC报错 404:Bad request
Java__han
博客等级 码龄10年 8粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值