日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

struts2 防止重复提交 与 进入等待画面

發布時間:2024/7/23 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 struts2 防止重复提交 与 进入等待画面 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

演示重復提交的錯誤:

相關文件:


struts.xml

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd"><struts><package name="strutsqs" extends="struts-default"><action name="Login" class="com.gq.LoginAction"><result name="error">/error.jsp</result><result name="success">/success.jsp</result></action></package> </struts>login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><base href="<%=basePath%>"><title>My JSP 'login.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><form action="Login.action" method="post"><table width="207" border="1" height="82"> <tbody><tr> <td>?UserName:</td> <td>?<input type="text" name="username"></td></tr> <tr> <td>?Password:</td> <td>?<input type="password" name="password"></td></tr> <tr> <td>?<input type="submit" value="Login"></td> <td>?<input type="reset" value="Reset" name="reset"></td></tr> </tbody></table></form></body> </html>LoginAction.java

public class LoginAction {private String username;private String password;public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}@SuppressWarnings("unchecked")public String execute() throws Exception{// Just for test of token.System.out.println( "name:" + getUsername() + "\tpassword:" + getPassword());consumeTimeForToken();if( getUsername().equals("gqltt") && getPassword().equals("123")){addToSessionScope("user", getUsername());return "success";}return "error";}@SuppressWarnings("unchecked")void addToSessionScope( String key, String value ){ActionContext.getContext().getSession().put(key, value);}//消耗時間,提供重復提交的機會void consumeTimeForToken(){int result = 0;for( int i = 0 ; i<30000000 ; i++ ){result += (int)i/551.22;result /= 3.1458;}System.out.println("result=" + result);}// Just used for unit test!String findCompanyByName( ){Map<String, String> records = new HashMap<String, String>();records.put("gqltt", "SNJP");records.put("Liyanhong", "baidu");records.put("Bill", "Microsoft");return records.get( getUsername() );} }提交頁面:

輸出結果:

解決辦法:

1、在提交頁面的 form 中添加 <s:token/>


2、在Struts2 的配置文件中啟用 TokenInterceptor攔截器或 TokenSessionStoreInterceptor攔截器

注意:

1、必須配置默認的攔截器(basicStack),否則取不到數據,拋出 NullPointerException

2、必須指定重復提交后的錯誤頁面(invalid.token)

優點:可以防止客戶重復提交,大大地降低了服務器的負荷。

缺點:對用戶來說,可能會很不方便,一不小心點擊了提交按鈕,進入到了invalid.token頁面,就再也回不去了,上述的操作就再也看不見了。(的確很惡心,即使倒退回登錄頁面,再次正常登錄,還是會進入 invalid.token 頁面!除非關掉網頁再打開。)

參考:http://chengyue2007.iteye.com/category/73492?show_full=true

等待畫面:

struts.xml 添加配置:

<action name="LongLived" class="com.gq.LongLivedAction"><interceptor-ref name="completeStack"/> <interceptor-ref name="execAndWait"/> <result name="wait">/wait.jsp</result> <result name="error">/error.jsp</result><result name="success">/success.jsp</result> </action>LongLiveAction.java

public class LongLivedAction {private String username;private String password;public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}@SuppressWarnings("unchecked")public String execute() throws Exception{addToSessionScope("user", getUsername());// Just for test of token.System.out.println( "name:" + getUsername() + "\tpassword:" + getPassword());consumeTimeForToken();if( getUsername().equals("gqltt") && getPassword().equals("123")){//addToSessionScope("user", getUsername());return "success";}return "error";}@SuppressWarnings("unchecked")void addToSessionScope( String key, String value ){Map session = ActionContext.getContext().getSession();if( session == null ){System.out.println("Error: session is null...");return ;}session.put(key, value);//ActionContext.getContext().getSession().put(key, value);}//消耗時間void consumeTimeForToken(){try {Thread.sleep( 4*1000 );} catch (InterruptedException e) {// do nothing...}System.out.println("After 4 seconds...");} }wait.jsp

注意:不要忘了加入?<%@ taglib prefix="s" uri="/struts-tags"%>

<%@ page language="java" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="/struts-tags"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><base href="<%=basePath%>"><title>Please Wait</title><meta http-equiv="refresh" content="3;url=<s:url includeParams='all'/> "/> </head><body>Please Wait...</body> </html>

缺點:將參數寫在 URL 中,明文化了(密碼都看得到了!!!)



問題:取不到 session,Map session = ActionContext.getContext().getSession(); 操作一直返回 Null。為什么?


參考:http://webservices.ctocio.com.cn/java/470/9189470.shtml

下面是另一種,等待畫面的配置,可以解決 session 為 Null 的問題:

struts.xml 添加配置:

<action name="Wait" class="com.gq.WaitAction"> <interceptor-ref name="defaultStack"/><interceptor-ref name="execAndWait"> <param name="excludeMethods">input</param> <!-- 等待時間,執行時間沒有超過此值,將不顯示等待畫面 (毫秒) <param name="delay">1000</param>--> <!-- 間隔檢查時間,檢查后臺進程有沒有執行完畢,如果完成了它就立刻返回,不用等到等待,用戶不會看到等待畫面 <param name="delaySleepInterval">50</param>--> </interceptor-ref> <result name="wait">/wait.jsp</result> <result name="error">/error.jsp</result><result name="success">/success.jsp</result></action>

WaitAction.java

public class WaitAction extends ActionSupport implements SessionAware {private static final long serialVersionUID = -5724238080200557097L;private Map session;public void setSession(Map session) {this.session = session;}public Map getSession(){return session;}private String username;private String password;public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}@SuppressWarnings("unchecked")public String execute() throws Exception{System.out.println("In Wait.action");addToSessionScope("user", getUsername());// Just for test of token.System.out.println( "name:" + getUsername() + "\tpassword:" + getPassword());consumeTimeForToken();if( getUsername().equals("gqltt") && getPassword().equals("123")){//addToSessionScope("user", getUsername());return "success";}return "error";}@SuppressWarnings("unchecked")void addToSessionScope( String key, String value ){getSession().put(key, value);}//消耗時間void consumeTimeForToken(){try {Thread.sleep( 4*1000 );} catch (InterruptedException e) {// do nothing...}System.out.println("After 4 seconds...");} } 注意:Action 要實現 SessionAware接口(驗證過——這樣的添加屬性到 session 是OK 的!)

因為這個action將會以單獨的線程執行,所以你不能用ActionContext,因為它是ThreadLocal.這也就是說如果你要訪問session數據,你必須實現 SessionAware結構而不是調用ActionContext.getSesion() 。


wait.jsp(帶刷新失敗時候的超鏈接)

<%@page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s"uri="/struts-tags"%> <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="refresh" content="1;url=<s:url includeParams="none" />"/> <title> </title> </head> <body> <h1>數據處理中,請稍等......</h1> 如果沒有自動跳轉請<a href="<s:url includeParams="all" />">點這里</a>. </body> </html>其中的includeParams參數取值為:
none,不把參數加入到url參數中?
all,是把get和post中的參數加入到url參數中
get,是只把get中的參數加入到url參數中?

總結

以上是生活随笔為你收集整理的struts2 防止重复提交 与 进入等待画面的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产12页 | 深夜福利一区二区三区 | 五月天激情小说 | 国产精品国产三级国产aⅴ中文 | 国产做爰xxxⅹ高潮视频12p | cao国产| 久久免费在线 | 99av在线| 免费欧美 | 久草免费资源 | 欧美午夜久久久 | 小早川怜子一区二区三区 | 色狠久| 麻豆视频网站在线观看 | 日韩国产一区二区三区 | 久综合| 亚洲+小说+欧美+激情+另类 | 白浆网站 | 日韩毛片基地 | 一区二区三区天堂 | 美女在线国产 | 欧美国产日韩精品 | 少妇一级淫片aaaaaaa | 高清日韩一区 | 激情福利视频 | 欧美激情久久久久久 | 91视频直接看 | 欧美色视频一区二区三区 | 少妇脚交调教玩男人的视频 | 艳妇乳肉豪妇荡乳av无码福利 | 国产午夜大地久久 | 在线观看国产视频 | 欧美日韩精品久久久免费观看 | 浪荡奴双性跪着伺候 | 日本少妇作爱视频 | 色综合影视 | 成人手机在线观看 | 六月丁香婷婷综合 | 国产三级在线免费观看 | 欧美理论视频 | 情趣五月天 | 久久亚洲免费视频 | 国产精品第56页 | 色婷婷国产精品综合在线观看 | 内射合集对白在线 | 亚洲国产成人精品激情在线 | 国产欧美一区二区精品性色 | 成人7777| 国产精品腿扒开做爽爽爽挤奶网站 | 日韩欧美中文字幕一区二区三区 | 成人免费黄色网址 | 亚洲人妻电影一区 | 国产精品久久国产精麻豆96堂 | 久久久999国产精品 天堂av中文在线 | 毛茸茸亚洲孕妇孕交片 | 国产精品不卡在线 | 美女av在线免费观看 | 97人妻精品一区二区 | 一个色av| 欧色丰满女同hd | 天天做日日干 | 超碰黑丝 | 国产精品一区二区三区高潮 | 成人午夜视频在线 | 一区二区三区不卡在线 | 日韩精品极品视频 | 国产一级片在线 | 日本性视频网站 | 女同激情久久av久久 | 手机看片日韩欧美 | 久久婷婷亚洲 | 蜜臀久久精品久久久久久酒店 | 三女警花合力承欢猎艳都市h | 亚洲成人一区二区三区 | 亚洲国产中文在线 | 亚洲911精品成人18网站 | 欧美日韩五区 | 成人午夜性视频 | 91国内在线 | 双性受孕h堵精大肚生子 | 亚洲综合日韩精品欧美综合区 | 全国男人天堂网 | 午夜免费网 | 国产又大又黑又粗免费视频 | 久久影院中文字幕 | 黄色在线免费网站 | 第一福利在线 | 国产精品九色 | 五月天婷婷影院 | 国产亚洲综合在线 | 人人看人人草 | 亚洲av成人无码一二三在线观看 | 无码人妻精品一区二区蜜桃色欲 | ts人妖在线观看 | 波多野结衣影院 | 国产在线无 | 天天久久综合 | 欧美一区在线看 | 性欧美一级 |