Narisa.com: refresh form submit - Narisa.com

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

refresh form submit Rate Topic: -----

#1 User is offline   potato 

  • Newbie
  • Pip
  • Group: Members
  • Posts: 11
  • Joined: 10-June 05

Posted 11 June 2005 - 12:40 AM

ช่วยด้วยครับ คือ ผมใช้ struts อ่ะครับ พอมัน forward หน้าไปแล้ว พอกดปุ่ม refresh มันจะทำใน action อีกครั้งอ่ะ ครับ จะทำอย่างไรดีให้มันไม่ทำอีกครับ
0

#2 User is offline   fromhell 

  • Member
  • PipPip
  • Group: Members
  • Posts: 132
  • Joined: 09-June 05

Posted 11 June 2005 - 03:07 PM

potato, on Jun 11 2005, 12:40 AM, said:

หน้าไปแล้ว พอกดปุ่ม refresh มันจะทำใน action อีกครั้งอ่ะ ครับ จะทำอย่างไรดีให้มันไม่ทำอีกครับ
<{POST_SNAPBACK}>


เห็นได้ชัดว่าศึกษา Struts ในขณะที่ความรู้ HTTP ไม่แน่นพอ

เมื่อทำ action แล้ว ให้ใช้ HTTP Redirect เพื่อ เปลี่ยนโปรโตคอลจาก HTTP POST เป็น HTTP GET เวลากด reload ที่ browser จะไม่มีการ POST form อีกครั้ง

0

#3 User is offline   Bomber 

  • Topgun
  • View blog
  • Group: Topgun
  • Posts: 2271
  • Joined: 04-February 04

Posted 11 June 2005 - 09:34 PM

fromhell, on Jun 11 2005, 03:07 PM, said:


เห็นได้ชัดว่าศึกษา Struts ในขณะที่ความรู้ HTTP ไม่แน่นพอ

เมื่อทำ action แล้ว ให้ใช้ HTTP Redirect เพื่อ เปลี่ยนโปรโตคอลจาก HTTP POST เป็น HTTP GET เวลากด reload ที่ browser จะไม่มีการ POST form อีกครั้ง

<{POST_SNAPBACK}>

5555 ผมชักชอบ style การตอบกระทู้ของคุณมาจากนรกแล้วสิ แบบนี้เขาเรียกว่าติเพื่อก่อครับ ชอบจริงๆ
0

#4 User is offline   potato 

  • Newbie
  • Pip
  • Group: Members
  • Posts: 11
  • Joined: 10-June 05

Posted 11 June 2005 - 10:38 PM

ครับ ผมยังใหม่อยู่จิง ๆ

แต่ว่าใช้ HTTP Redirect ทำต่อจากหลัง action ยังไงเหรอครับ ยังไม่ค่อยเข้าใจเลย แล้วถ้ามันเปลี่ยนจาก post เป็น get แล้วมันจะช่วยยังไงเหรอครัย
0

#5 User is offline   up1 

  • Topgun
  • View blog
  • Group: Topgun
  • Posts: 2483
  • Joined: 04-March 04

Posted 12 June 2005 - 12:01 AM

ถ้าใช้ Struts แล้วมีปัญหาเรื่องนี้ ( After do Post ) ให้ศึกษาเรื่อง Token ของ Struts นะครับ เขา implement มาเพื่อแก้ปัญหานี้โดยเพาะครับ


ข้อมูลเพิ่มเติมครับ
http://www.theserver...thread_id=28366

http://www.theserver...thread_id=29758
0

#6 User is offline   potato 

  • Newbie
  • Pip
  • Group: Members
  • Posts: 11
  • Joined: 10-June 05

Posted 12 June 2005 - 01:24 PM

ผม ไปดูตามที่คุณ up1 บอกมาแล้ว แต่ยังไม่เข้าใจเลยอ่ะครับ ยังไงช่วยอธิบายหน่อยได้มั้ยครับ
0

#7 User is offline   นายข้าวโพดหวาน 

  • Committee
  • View blog
  • Group: Committee
  • Posts: 7075
  • Joined: 01-April 03

Posted 13 June 2005 - 12:33 AM

ปัญหานี้แก้ได้โดยการใช้ Introduce Synchronizer Token pattern ครับ หลักการก็คือ ใช้ session variable เก็บ token ไว้ว่าฟอร์มหน้านี้มีการ submit แล้วหรือยัง ถ้า submit ไปแล้ว ยูสเซอร์กด refresh (หรือเท่ากับ submit ฟอร์มนั้นอีกครั้ง) ตัว Struts servlet จะรู้ และเราสามารถใช้ if (isTokenValid(request)) { .. } else { ... } เช็คเพื่อป้องกันไม่ให้โค้ดรันซ้ำครับ

อีกบทความที่อธิบายเรื่องนี้ http://www.javaworld.com/javaworld/javatip...javatip136.html

Pattern นี้อธิบายอยู่ในหนังสือ Core J2EE Patterns หน้า 77 ครับ
0

#8 User is offline   potato 

  • Newbie
  • Pip
  • Group: Members
  • Posts: 11
  • Joined: 10-June 05

Posted 16 June 2005 - 10:36 AM

ผมไปดูถามที่คุณ นายข้าวโพดหวานบอกไว้แล้วครับ แต่ว่า
isTokenValid(request) นี้อ่ะครับมัน return false ตลอดเลยอ่ะครับ ผมลองพิมพ์ออกมาดู ยังไงมันก็ false อยู่ดี ผมยังทำอะไรผิดไปหรือเปล่าครับ ผมลองเขียน Action ยังงี้อ่ะครับ

public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {

System.out.println("+++++++IN test1+++++++++++");

System.out.println("status before =" + isTokenValid(request) );

if (isTokenValid(request)) {
System.out.println("true");
} else {
System.out.println("false");
}

saveToken(request);
System.out.println("status after =" + isTokenValid(request) );

return mapping.findForward( "success");
}
0

#9 User is offline   นายข้าวโพดหวาน 

  • Committee
  • View blog
  • Group: Committee
  • Posts: 7075
  • Joined: 01-April 03

Posted 16 June 2005 - 12:16 PM

ในตัวอย่างบทความที่เค้าให้เป็นเพียง Action ตัวเดียวนะครับ การใช้ token จะต้องมีการ saveToken โดย action ก่อนหน้านั้นก่อน แล้วพอ forward มาถึง action ปัจจุบัน ถึงจะเช็คด้วย isTokenValid() ได้ ดังนั้นถ้าคุณเริ่มจากการใช้ isTokenValid() เลย มันก็รีเทิร์น false แน่ๆเพราะยังไม่มีใคร saveToken() มาก่อน ผมแนะนำให้ไปดาวน์โหลดซอร์สโค้ดของบทความทั้งหมด (ลิงก์อยู่ในส่วน resource ท้ายบทความครับ) ตัว ForwardSynchroAction.java เป็นตัว saveToken() ครั้งแรก

รายละเอียดที่เกี่ยวข้องลองไปอ่านที่ isTokenValid(request) is always returning false กับ class org.apache.struts.action.Action JavaDoc ดูนะครับ
0

#10 User is offline   potato 

  • Newbie
  • Pip
  • Group: Members
  • Posts: 11
  • Joined: 10-June 05

Posted 16 June 2005 - 02:11 PM

ผมไปดาวน์โหลดซอร์สโค้ด มาตั้งแต่คราวที่แล้วแล้วครับ
แล้วผมก็ลองทำตามแล้ว แต่ก็ยังงง แล้วมันก็ยัง return false
แล้วถ้ามันต้อง saveToken() ตั้งแต่ Action ตัวก่อน แล้วมาถึง Action ตัวปัจจุบันถึงจะใช้ isTokenValid() ได้
ผมก็ลอง saveToken() ตั้งแต่ Action ตัวแรก ๆ แล้ว แล้วพอตัวถัดมา ลองเช็ค isTokenValid() ก็ยังได้ false อยู่ดีอ่ะครับ

ขอถามเพิ่มอีกนิดนะครับ แล้วถ้าผม saveToken() ตั้งแต่ Action ตัวก่อน แล้วมันจะช่วยยังไงให้เวลาผมกด refresh แล้วไม่ต้องทำตัว Action ตัวปัจจุบันอ่ะครับ ไม่เข้าใจอ่ะครับ

ต้องขอโทษด้วยนะครับ ที่ความรู้ผมยังน้อย เลยเข้าใจอะไรยาก ๆ ๆ
0

#11 User is offline   potato 

  • Newbie
  • Pip
  • Group: Members
  • Posts: 11
  • Joined: 10-June 05

Posted 17 June 2005 - 09:21 AM

ผมลองไปค้นหาดูเกี่ยวกับ saveToken() แล้วครับ ตัวอย่างทั้งหลาย ก็เหมือน ๆ กันหมดเลย
แต่ทำไมพอผมทดลองตามตัวอย่างแล้ว ผมก็ยังไม่ได้อยู่ดีอ่ะครับ
0

#12 User is offline   tennessee 

  • Member
  • PipPip
  • Group: Members
  • Posts: 133
  • Joined: 15-May 03

Posted 18 June 2005 - 11:07 PM

ถ้าต้องการป้องกันการ submit สองครั้งซ้อน เช่น user จิ้ม submit รัวๆ ก็คงต้องใช้วิธีแบบที่คุณๆ ข้างบนบอกไว้


แต่ถ้าต้องการแค่ เวลา user จิ้มแล้ว รอ... หน้าใหม่โหลดมา แล้วเค้ากด refresh
แบบนี้ใช้หลักการ redirect after post ดีกว่าครับ
ผมไม่รู้ว่าใน struts ได้รองรับวิธีนี้ไว้แล้วหรือไม่
แนะนำให้ลองหาคำว่า "redirect after post" ใน google ดูครับ

ข้อดีของวิธีนี้ก็คือ ทำง่าย
ส่วนข้อเสียคือ ป้องกันการจิ้มรัวไม่ได้ และข้อมูลใน request ล่าสุดหายไป เพราะการ redirect ครั้งหลังจะเป็นคนละ request กับครั้งแรก
0

#13 User is offline   นายข้าวโพดหวาน 

  • Committee
  • View blog
  • Group: Committee
  • Posts: 7075
  • Joined: 01-April 03

Posted 19 June 2005 - 12:56 AM

tennessee, on Jun 18 2005, 10:07 AM, said:

ส่วนข้อเสียคือ ป้องกันการจิ้มรัวไม่ได้ และข้อมูลใน request ล่าสุดหายไป เพราะการ redirect ครั้งหลังจะเป็นคนละ request กับครั้งแรก
<{POST_SNAPBACK}>


ผมเห็นเวปเค้าป้องกันการจิ้มรัว โดยการ disable ปุ่ม submit หลังจากปุ่มนี้ถูกกดครับ
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users