在JSF中防止页面刷新重复提交

原创 2007年09月19日 13:38:00

在WEB开发中都会碰见这样的情况,就是用户在进行了一项操作后按F5刷新页面会重复提交页面的问题。

先了解下浏览器按F5会发生什么事,在按下F5后浏览器并不是简单的刷新页面,而是模拟上一次的请求一模一样的再向服务器请求一次,加入上一次的请求是向服务器请求保存数据,那按F5后就会再一次请求保存数据,这样就等于重复提交了一次保存数据,如果我们系统中不做判断的话,很容易在用户不小心按F5后再一次把数据保存进数据库了。

方案:
因为按F5是完全模拟上次的请求再请求一次,可以说发送的数据和上次请求的是一样的,就想到可以在客户端和服务器端各保存一个标识状态,然后在请求中比较2个表示状态就好了。

我把我的解决方法做成1个组件,这样就可以在所有需要使用的页面上使用该组件了,下面就直接看组件的代码吧
(如何编写组件这里就先不说)。

package com.byd.jsfcomponents.Refresh;

import java.io.IOException;
import javax.faces.component.UIComponentBase;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.servlet.http.HttpSession;
/** *//**
 * JSF中防刷新的控件 同时在客户端和服务端保存一样的值,
 *                  每次请求都改变2个的值(和以前的值相反),如果是刷新,取到的客户端的值将服务端的值不一样。
 
*/

public class HtmlRefresh extends UIComponentBase...{
    
private boolean m_refreshState;
    
private boolean m_isRefresh;
    
    
/** *//**
     *  当前请求是否是刷新
     *  
@return true 是;false 不是;
     
*/

    
public boolean IsRefresh()...{
        
return m_isRefresh;
    }

    
    
/** *//**
     *  返回对应的渲染器,这里没有单独的渲染器,所以返回null
     
*/

    
public String getFamily()...{
        
return null;
    }

        
    
// <editor-fold defaultstate="collapsed" desc="保存恢复视图">
    /** *//**
     *  保存视图
     
*/

    
public Object saveState(FacesContext context)...{
        Object values[] 
= new Object[2];
        values[
0= super.saveState(context);          //  系统自己的State
        
// 保存客户端的值
        values[1= !m_refreshState;
        
// 服务器的值保存到session中
        ExternalContext exContext = FacesContext.getCurrentInstance().getExternalContext();
        HttpSession session 
= (HttpSession)exContext.getSession(true);
        session.setAttribute(
"ServerRefresh",m_refreshState);
        
        
return values;
    }

    
/** *//**
     *  恢复视图
     
*/

    
public void restoreState(FacesContext context, Object state)...{
        Object values[] 
= (Object[]) state;
        
super.restoreState(context, values[0]);
        
this.m_refreshState = (Boolean)values[1];
        
//  取服务器端值
        ExternalContext exContext = FacesContext.getCurrentInstance().getExternalContext();
        HttpSession session 
= (HttpSession)exContext.getSession(true);
        Boolean _bRefresh 
= false;
        
if(session.getAttribute("ServerRefresh"!= null)...{
            _bRefresh 
= Boolean.valueOf(session.getAttribute("ServerRefresh").toString());
        }

        
        m_isRefresh 
= m_refreshState == _bRefresh;
    }

    
// </editor-fold>
}



在页面中使用如下:

<%@ taglib uri="http://www.byd.com.cn/component" prefix="byd" %>
<byd:HtmlRefresh id="HtmlRefresh1" binding="#{Page1.htmlRefresh1}" />

JAVABEAN代码:
private HtmlRefresh htmlRefresh1 = new HtmlRefresh();
    public HtmlRefresh getHtmlRefresh1() {
        return htmlRefresh1;
    }   
    public void setHtmlRefresh1(HtmlRefresh htmlRefresh1) {
        this.htmlRefresh1 = htmlRefresh1;
    }
  public String button1_action() {
       // 先判断是否刷新
        if(htmlRefresh1.IsRefresh()){
            this.label1.setText("请别刷新提交");
        }else{
            this.label1.setText("正常提交");
        }
        return null;
    }

开发环境:NetBeans5.5.1 + netbeans-visualweb-5_5-windows-zh_CN.exe

附原代码:点击下载

JSP刷新页面的几种方法

Javascript刷新页面的几种方法   :    1.   history.go(0)    2.   location.reload()    3.   location=location...
  • weifeib
  • weifeib
  • 2016年07月01日 16:08
  • 16883

APPStore上架应用支持IPV6的那些事

果然是苹果打个哈欠,iOS行业内就得起一次风暴呀。自从5月初Apple明文规定所有开发者在6月1号以后提交新版本需要支持IPV6-Only的网络,大家便开始热火朝天的研究如何支持IPV6,以及应用中哪...

Server Java 四 :如何在用JSF在服务器端处理Ajax请求

Server Java 四 :如何在用JSF在服务器端处理Ajax请求 博客分类: ArcGISServer JavaAjaxJSFServletXML  服务器端的处理才...

防卡页面刷新重复提交

  • 2008年07月08日 23:59
  • 10KB
  • 下载

php 防止页面刷新重复提交

一.使用session防止重复提交  其实跟验证码一样的原理,主要是生成session和input隐藏域, 这边我的代码是在一个页面中处理。 ...

JSP中如何防止页面刷新重复提交

在WEB开发中都会碰见这样的情况,就是用户在进行了一项操作后按F5刷新页面会重复提交页面的问题。   先了解下浏览器按F5会发生什么事,在按下F5后浏览器并不是简单的刷新页面,而是模拟上一次的...

.net 防止页面刷新重复提交

在客户端保存一个标志,在服务端也保存一个标志,在提交时对比两个标志的值,来判断是否是重复提交。 先看下面代码,首先是一个RefreshAction静态类,这个类主要是用来初始化服务端Session保...

java防止页面刷新重复提交

看了网上的,有几种方法: 1 在你的表单页里HEAD区加入这段代码: 2 生成一个令牌保存在用户session中,在form中加一个hidden域,显示该令 牌的值,...
  • JasonSSH
  • JasonSSH
  • 2012年05月02日 16:32
  • 13093

<转>如何防止页面刷新,后退导致的重复提交

转载于:http://www.cnblogs.com/end/archive/2011/12/17/2291005.html 1,客户端: btn submit之后禁用所有提交按钮或控件, 也可以加...
  • jdzms23
  • jdzms23
  • 2013年09月07日 21:51
  • 1289
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在JSF中防止页面刷新重复提交
举报原因:
原因补充:

(最多只允许输入30个字)