JSP入門のはFormフォームの繰り返し提出するいくつかの方案を免れます.
13043 ワード
JSP入門の初級学習者フォームの提出は非常に迷惑な問題ですが、Formフォームが何度も提出されないようにするにはどうすればいいですか?以下のいくつかの面から入手できます.
一.初心者JSPについては、まずJavascriptで設定することができます.
変数を設定します.一回だけフォームの提出を許可します.
フォーム提出ボタンまたはイメージをdisableにします.
基本原理:
サーバ側は、到着した要求を処理する前に、要求に含まれるトークン値と現在のユーザセッションに保存されているトークン値とを比較し、一致するかどうかを確認する.この要求を処理した後、応答をクライアントに送信する前に、クライアントに送信する以外に、ユーザセッションに保存されている古いトークンを置き換える新しいトークンが生成される.このように、ユーザが先ほどの提出ページに戻り、再度提出すると、クライアントから送信されたトークンはサーバ端末のトークンと一致しなくなり、重複した送信の発生を効果的に防ぐことができる.
if (istokenValid(request) true { // ヨール コード here return mappingn.findForward(「success」); } else { saveToken(request) return mappingn.findForward("submitagain") ) STRUTSは、ユーザセッションIDと現在のシステム時間に基づいて一意(セッション毎)トークンを生成し、具体的には、TokenProcessorクラスのgeneratoken()方法を参照することができる.
1.//検証トランザクション制御トークン、<html:form>は自動的にセッション中の識別に基づいてトークンを生成し、2回の提出を防ぐ.
2.actionで:
四.JSP入門時にはページ方式を把握する必要があります.
JSP入門の角度については、中継ページを追加することにより、視覚的には良くないが、ページ間では煩雑であるが、Formフォームの重複提出を効果的に回避する良い方法である.
一.初心者JSPについては、まずJavascriptで設定することができます.
変数を設定します.一回だけフォームの提出を許可します.
- ﹤script language="javascript"﹥
- var checkSubmitFlg = false;
- function checkSubmit() {
- if (checkSubmitFlg == true) {
- return false;
- }
- checkSubmitFlg = true;
- return true;
- }
- document.ondblclick = function docondblclick() {
- window.event.returnValue = false;
- }
- document.onclick = function doconclick() {
- if (checkSubmitFlg) {
- window.event.returnValue = false;
- }
- }
- ﹤/script﹥
-
- ﹤html:form action="myAction.do" method="post" onsubmit="return checkSubmit();"﹥
二. JSP人門についてはJavascriptのもう一つの設定を把握しなければなりません.フォーム提出ボタンまたはイメージをdisableにします.
- ﹤html:form action="myAction.do" method="post"
- onsubmit="getElById('submitInput').disabled = true; return true;"﹥
- ﹤html:image styleId="submitInput" src="images/ok_b.gif" border="0" /﹥
- ﹤/html:form﹥
第三に、JSP入門段階においても、STRUTSの同期トークン機構を利用して、同期トークン(Token)機構を利用して、WebアプリケーションにおいてFormフォームの繰り返し提出の問題を解決することに注意し、Strutsも参照の実現を与えた.基本原理:
サーバ側は、到着した要求を処理する前に、要求に含まれるトークン値と現在のユーザセッションに保存されているトークン値とを比較し、一致するかどうかを確認する.この要求を処理した後、応答をクライアントに送信する前に、クライアントに送信する以外に、ユーザセッションに保存されている古いトークンを置き換える新しいトークンが生成される.このように、ユーザが先ほどの提出ページに戻り、再度提出すると、クライアントから送信されたトークンはサーバ端末のトークンと一致しなくなり、重複した送信の発生を効果的に防ぐことができる.
if (istokenValid(request) true {
1.//検証トランザクション制御トークン、<html:form>は自動的にセッション中の識別に基づいてトークンを生成し、2回の提出を防ぐ.
2.actionで:
- //﹤input type="hidden" name="org.apache.struts.taglib.html.TOKEN"
- // value="6aa35341f25184fd996c4c918255c3ae"﹥
- if (!isTokenValid(request))
- errors.add(ActionErrors.GLOBAL_ERROR,
- new ActionError("error.transaction.token"));
- resetToken(request); // session
3.actionトークンを生成する方法がある.
- protected String generateToken(HttpServletRequest request) {
- HttpSession session = request.getSession();
- try {
- byte id[] = session.getId().getBytes();
- byte now[] =
- new Long(System.currentTimeMillis()).toString().getBytes();
- MessageDigest md = MessageDigest.getInstance("MD5");
- md.update(id);
- md.update(now);
- return (toHex(md.digest()));
- } catch (IllegalStateException e) {
- return (null);
- } catch (NoSuchAlgorithmException e) {
- return (null);
- }
- }
更新時にフォームボタンの重複クリックを防止し、主にSessionで判断します.四.JSP入門時にはページ方式を把握する必要があります.
- ﹤input type="hidden " name=" ﹤% =com.lims.util.SynchroToken.TOKEN_NAME%﹥ " value =" ﹤%= com.lims.util.SynchroToken.getToken(request)%﹥" ﹥
-
- SynchroToken.java
- package com.lims.util;
- import org.apache.struts.util.*;
- import javax.servlet.http.*;
- import javax.servlet.jsp.*;
- import org.apache.struts.action.*;
- /**
- * ﹤p﹥Title: SynchroToken ﹤/p﹥
- * ﹤p﹥Description: ﹤/p﹥
- * ﹤p﹥Copyright: Copyright (c) 2004﹤/p﹥
- * ﹤p﹥Company: NetStar﹤/p﹥
- * @author Jstar
- * @version 1.0
- * Created in 2004/04/21
- */
- public class SynchroToken{
- public final static java.lang.String TOKEN_NAME = "_token";
- public static boolean checkToken (HttpServletRequest request){
- boolean isEqual = false;
- HttpSession session = request.getSession ();
- String formToken = request.getParameter (TOKEN_NAME);
- String sessionToken = (String)session.getAttribute (TOKEN_NAME);
- System.out.println ("formToken: " + formToken + " sessionToken: " +
- sessionToken);
- if (formToken != null && sessionToken == null){
- session.setAttribute (TOKEN_NAME, formToken);
- isEqual = true;
- }
- return isEqual;
- }
- /**
- * Insert the method's description here.
- * Creation date: (4/19/2004 3:23:25 PM)
- * @return java.lang.String
- * @param request javax.servlet.http.HttpServletRequest
- */
- public static String getToken (HttpServletRequest request){
- String token = "" + System.currentTimeMillis ();
- HttpSession session = request.getSession ();
- if (session != null){
- session.removeAttribute (TOKEN_NAME);
- }
- return token;z
- }
- /**
- * Insert the method's description here.
- * Creation date: (4/19/2004 3:24:10 PM)
- * @return java.lang.String
- */
- final static java.lang.String getTOKEN_NAME (){
- return TOKEN_NAME;
- }
- public static String message (PageContext pageContext, String key) throws
- JspException{
- return RequestUtils.message (pageContext, null, null, key);
- }
- }
-
五.中継ページを追加することにより、JSP入門の角度については、中継ページを追加することにより、視覚的には良くないが、ページ間では煩雑であるが、Formフォームの重複提出を効果的に回避する良い方法である.