在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

附原代码:点击下载

jsf页面参数的传递及加载数据

最近在做页面的时候遇到了在两个页面传递参数的问题,发现还挺有代表性的,找到这篇文章,转一下jsf页面参数的传递及加载数据2006.4.在同一个页面实现功能,可以用ActionListener或用Act...
  • Rick_ang
  • Rick_ang
  • 2006-08-30 17:29:00
  • 2109

Primefaces+JSF中页面组件update刷新问题,求大神解惑!

最近使用primefaces+jsf进行开发时遇到一个诡异的问题,一个页面的代码运行无误,然后将此页面的代码复制添加到另一个页面中运行,后台代码不变。程序浏览器都不会报错,但页面显示有问题,不能正常刷...
  • enjoy_waste_time
  • enjoy_waste_time
  • 2017-10-31 09:27:26
  • 299

在JSF页面利用Ajax实现局部刷新

本人对JSF接触不久,所以很多知识都没有学到。这几天做项目用到两个问题: 1.点击测试按钮,刷新的是整个页面,这种效果对用户的感知度不好,希望达到的是局部刷新的目的。 2.点击测试按钮,load进...
  • zhaoxd_1
  • zhaoxd_1
  • 2013-10-25 15:15:56
  • 2989

Web应用中重复提交的问题的三种解决方案

Web应用中重复提交的问题的三种解决方案前两种是利用javascript,后面一种是在使用Struts的情况下的参考实现1 javascript ,设置一个变量,只允许提交一次。    var che...
  • daryl715
  • daryl715
  • 2007-04-20 16:16:00
  • 883

JSF 跳转至新页面问题

在Neatbeans中创建JSF文件,在页面中放置一个按钮,作用是点击此按钮,跳转到新的页面而不显示新窗口.做法是:双击JSF页面中的按钮,生成JAVA文件中的ACTION()方法.在方法里添加如下代...
  • meteorlWJ
  • meteorlWJ
  • 2007-12-01 09:08:00
  • 2224

页面重复提交解决方法(JAVA)

一 重复提交包括: 页面刷新和按钮提交   a) 提交后,将按钮隐藏或者变灰 (针对按钮提交)   b) JavaScript代码(针对按钮提交)        var dcFlag=false;  ...
  • ahwen_2006
  • ahwen_2006
  • 2007-04-19 10:15:00
  • 485

Jsp 防止表单重复提交几种方案

SP避免Form重复提交的三种方案  1) javascript ,设置一个变量,只允许提交一次。        var checksubmitflg = false;    func...
  • kalision
  • kalision
  • 2012-08-09 14:59:11
  • 24397

JSF

在eclipse下,开启远程debug模式可在不启动jboss服务器的情况下编辑class并实时生效。...
  • al_jin
  • al_jin
  • 2015-02-04 11:40:46
  • 485

两种方式 让客户端 缓存失效

asp.net  发布的时候经常遇到 js ,css  或者 图片什么的没有更新,这是好多程序员都要 按ctrl+F5 强制刷新一下,但是chrome 浏览器 有时候 要7-8次才算正常。 对应新手来...
  • dyllove98
  • dyllove98
  • 2013-03-21 16:23:01
  • 773

ASP.NET Ajax发布时异步刷新失效的问题解决方法

在一个小型项目中,我使用了Ajax Extensions中的UpdatePanel控件,在本地调试运行时好的,可以看到ajax的异步刷新效果,但是当发布到安装了.net framework 3.5 s...
  • suhy2009
  • suhy2009
  • 2010-03-16 16:51:00
  • 1650
收藏助手
不良信息举报
您举报文章:在JSF中防止页面刷新重复提交
举报原因:
原因补充:

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