JAVA–利用Filter和session防止页面重复提交

JAVA–利用Filter和session防止页面重复提交
解决思路:
1 用户访问表单页面,先经过过滤器,过滤器设置一个随机id作为token令牌, 并将该token放入表单隐藏域中.
2 表单响应到浏览器,用户填充数据后提交请求;
3 请求经过过滤器,过滤器获取表单中的令牌进行验证,如果和之前生成的令牌一致,则将请求放行,并且清空令牌;
4 如果用户重复提交表单,请求经过过滤器,过滤器进行验证.因为第一次放行后令牌已经清空失效,令牌不一致,不放行.跳转到提醒界面.

需用知识:
1 过滤器基础知识
2 servlet基础知识
3 filter基础知识
4 jsp基础知识

代码实现

1 jsp实现form表单页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="login" method="post">
		<!-- 利用表单的隐藏域 保存token令牌 -->
		<!--  ${token}等价于req.getsession().getAttribute("token")-->

		<input type="hidden" name="token" value="${token}" />
		用户名:<input type="text" name="username"/><br/>
		密码:<input type="password" name="password"/><br/>
		<input type="submit" value="login"/>
	</form>
</body>
</html>

  

2 filter过滤器

package com.woniu.filter.controler;

import java.io.IOException;
import java.util.UUID;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet Filter implementation class TokenFilte
 */

//过滤所有servlet
@WebFilter("*")

public class TokenFilte implements Filter {

    public TokenFilte() {
        // TODO Auto-generated constructor stub
    }

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		//设置编码集
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charser=utr-8");
		//向下转型
		HttpServletRequest req=(HttpServletRequest) request;
		HttpServletResponse resp=(HttpServletResponse) response;

		//获取表单的token
		String parameterToken = req.getParameter("token");
		//获取session中的token
		String sessionToken = (String) req.getSession().getAttribute("token");

		//判断表单的token,不为空说明用户已经提交form表单,需要验证是否重复提交,
		//为空说明是第一次进入登录页面,需要设置token
		if (parameterToken!=null) {
			//判断两个令牌是否相等,相等则放行,并重置令牌
			if(parameterToken.equals(sessionToken)) {
				//重置令牌
				req.getSession().removeAttribute("token");
				chain.doFilter(request, response);
			}else {//说明是重复提交,转发到提示页面
				req.getRequestDispatcher("repeatReminder").forward(request, response);

			}
		}else {//第一次进来,需要设置令牌
			//生成宇宙唯一码
			String token = UUID.randomUUID().toString();
			//设置session
			req.getSession().setAttribute("token",token);
			//放行
			chain.doFilter(request, response);
		}

	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub

	}

}

  

3 表单响应的servlet
利用线程睡30秒,模拟网络拥堵

package com.woniu.filter.controler;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class PrintUser
 */
@WebServlet("/login")
public class Login extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public Login() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			//线程睡30秒,便于演示网络拥堵
			Thread.sleep(30000);
			response.getWriter().write("登录成功");
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

  

4 重复提交时响应的servlet
重复提交时跳转到该提醒页面

package com.woniu.filter.controler;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class repeatReminder
 */
@WebServlet("/repeatReminder")
public class repeatReminder extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public repeatReminder() {
        super();
        // TODO Auto-generated constructor stub
    }
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().write("页面正在处理,请勿重复提交");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

  

原文地址:https://www.cnblogs.com/xiaobozhi/p/11604490.html

时间: 2025-01-04 23:25:21

JAVA–利用Filter和session防止页面重复提交的相关文章

php利用session防止页面重复刷新

如何防止页面重复刷新,在php环境下可以利用session来轻松实现. b.php的代码 <?php //只能通过post方式访问 if ($_SERVER['REQUEST_METHOD'] == 'GET') {header('HTTP/1.1 404 Not Found'); die('亲,页面不存在');} session_start(); $fs1=$_POST['a']; $fs2=$_POST['b']; //防刷新时间,单位为秒 $allowTime = 30; //读取访客ip

黑马day05 session实现防止重复提交&amp;小案例

有时候为了防止用户的重复提交我们只需要写前台的代码,一个javaScript就搞定了,但是也不妨坏人故意修改源代码,这样就防止不了重复提交,因此,我们在后台实现防止重复提交. 1.login.jsp 前台java|Script实现防止重复提交,为了后台也实现所以设置了一个随机数到session域中,然后提交表单的时候就隐藏一个随机数.以实现SubServlet的获取 <%@ page language="java" import="java.util.*" p

防止页面重复提交

当页面Get的时候: 生成一个Token(如GUID .MD5等字符串),存入页面一个隐藏域 ,且存入Session 当页面提交的时候 获取隐藏域的值,和服务器Session进行校验 校验成功 清除Session Over 接下来就是EF CodeFirst+MVC3的B2C电商设计

【ASP.NET】 【防止连续多次点击提交按钮 导致页面重复提交】

最近做项目遇到了这样的情况: 公司网络比平常慢了不少,在点击保存按钮提交页面后需等待挺长的一段时间,忍不住手贱点多了几次,当提交完成后发现数据库语句执行异常. 两种验证方式: 第1种: aspx页面按钮: <asp:Button ID="btnSumbit" runat="server" Text="提交" onclick="btnSumbit_Click" /> Page_Load 事件: btnSumbit.A

【layui】一个简单的防止页面重复提交的方法

基本思路是:点击提交按钮后弹出遮罩层,防止多次点击导致的重复提交. 1 <div class="layui-form-item"> 2 <div class="layui-input-block t-c" > 3 <input id="file-submit" class="layui-btn" lay-submit lay-filter="demo1" value="

利用Filter实现session拦截

1.在web.xml中配置 <!-- Session监听器 --> <filter> <filter-name>sessionValidateFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <fi

【转】防止页面重复提交

//sb保存的是JavaScript脚本代码,点击提交按钮时执行该脚本        StringBuilder sb = new StringBuilder();        //保证验证函数的执行         sb.Append("if (typeof(Page_ClientValidate) == 'function') { if (Page_ClientValidate() == false) { return false; }};");        //点击提交按钮后

cookie和session页面随机数和防止重复提交

http 无状态的协议,每次请求都是独立的我们不能存储第一次访问的数据 Cookie 实现访问请求的数据保存 将服务器中的一小段,存入浏览器中放在浏览器中的cookie中,是存入浏览器中. 优点:减少服务器的压力 缺点:不安全,存储的数据单一,只能为字符串,可以通过路由器获得所有的cookie 1. 添加cookie 2. 获得cookie 3. 解决中文乱码问题 4. 修改cookie的两种方式(cookie为键值对,key值不能重复,或者cookie.setvalues()) 5. 生命周期

学习笔记(五)Session 的创建和销毁 生命周期 表单重复提交及实现验证码

1. Session 的创建和销毁 page 指定的 session 属性: 1). 默认情况下, 第一次访问一个 WEB 应用的一个 JSP 页面时, 该页面都必须有一个和这个请求相关联的 Session 对象. 因为 page 指定的 session 属性默认为 true 2). 若把 session 属性改为 false, JSP 页面不会要求一定有一个 Session 对象和当前的 JSP 页面相关联所以若第一次访问当前 WEB 应用的 JSP 页面时, 就不会创建一个 Session