เหตุใด JSF จึงต้องบันทึกสถานะของส่วนประกอบ UI ทางฝั่งเซิร์ฟเวอร์
เนื่องจาก HTTP ไม่มีสถานะและ JSF เป็นสถานะ โครงสร้างคอมโพเนนต์ JSF อาจมีการเปลี่ยนแปลงแบบไดนามิก (เป็นโปรแกรม) JSF เพียงแค่ต้องการทราบสถานะที่แน่นอนเหมือนเดิมเมื่อฟอร์มถูกแสดงไปยัง enduser เพื่อให้สามารถประมวลผลวงจรชีวิต JSF ทั้งหมดได้สำเร็จตามข้อมูลที่จัดเตรียมโดยโครงสร้างส่วนประกอบ JSF ดั้งเดิมเมื่อส่งแบบฟอร์มกลับไป เซิฟเวอร์. โครงสร้างคอมโพเนนต์ให้ข้อมูลเกี่ยวกับชื่อพารามิเตอร์การร้องขอตัวแปลง / ตัวตรวจสอบที่จำเป็นคุณสมบัติ bean ที่ถูกจัดการที่ถูกผูกไว้และวิธีการดำเนินการ
JSF บันทึกสถานะของคอมโพเนนต์ UI บนฝั่งเซิร์ฟเวอร์จนถึงช่วงเวลาใดและเมื่อใดที่ข้อมูลสถานะของคอมโพเนนต์ UI จะถูกลบออกจากหน่วยความจำเซิร์ฟเวอร์
คำถามทั้งสองนี้ดูเหมือนจะเดือดดาลเหมือนกัน อย่างไรก็ตามนี่เป็นการใช้งานเฉพาะและขึ้นอยู่กับว่าสถานะถูกบันทึกไว้บนเซิร์ฟเวอร์หรือไคลเอนต์ การใช้งานที่เหมาะสมเล็กน้อยจะลบออกเมื่อหมดอายุหรือเมื่อคิวเต็ม ตัวอย่างเช่น Mojarra มีขีด จำกัด เริ่มต้นที่ 15 มุมมองเชิงตรรกะเมื่อการบันทึกสถานะถูกตั้งค่าเป็นเซสชัน สามารถกำหนดค่าได้ด้วยพารามิเตอร์บริบทต่อไปนี้ในweb.xml
:
<context-param>
<param-name>com.sun.faces.numberOfLogicalViews</param-name>
<param-value>15</param-value>
</context-param>
ดูคำถามที่พบบ่อยของ Mojarraสำหรับพารามิเตอร์เฉพาะของ Mojarra และคำตอบที่เกี่ยวข้องcom.sun.faces.numberOfViewsInSession เทียบกับ com.sun.faces.numberOfLogicalViews
ในฐานะผู้ใช้ที่ล็อกอินบนแอปพลิเคชันจะสำรวจหน้าต่างๆสถานะของส่วนประกอบจะยังคงสะสมอยู่บนเซิร์ฟเวอร์หรือไม่
ในทางเทคนิคนั้นขึ้นอยู่กับการนำไปใช้งาน หากคุณกำลังพูดถึงการนำทางแบบหน้าต่อหน้า (เพียงแค่รับคำขอ) Mojarra จะไม่บันทึกอะไรในเซสชัน หากเป็นคำขอ POST (รูปแบบที่มีลิงก์ / ปุ่มคำสั่ง) Mojarra จะบันทึกสถานะของแต่ละฟอร์มในเซสชันจนถึงขีด จำกัด สูงสุด สิ่งนี้ช่วยให้ enduser สามารถเปิดหลายรูปแบบในแท็บเบราว์เซอร์ต่างๆในเซสชันเดียวกัน
หรือเมื่อตั้งค่าการบันทึกสถานะเป็นไคลเอนต์ JSF จะไม่จัดเก็บอะไรในเซสชัน คุณสามารถทำได้โดยใช้พารามิเตอร์บริบทต่อไปนี้ในweb.xml
:
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
จากนั้นจะต่ออนุกรมกับสตริงที่เข้ารหัสในช่องอินพุตที่ซ่อนอยู่พร้อมชื่อjavax.faces.ViewState
ของแบบฟอร์ม
ฉันไม่เข้าใจว่าประโยชน์ของการรักษาสถานะขององค์ประกอบ UI บนฝั่งเซิร์ฟเวอร์คืออะไร การส่งผ่านข้อมูลที่ตรวจสอบแล้ว / แปลงไปยังถั่วที่มีการจัดการโดยตรงไม่เพียงพอหรือไม่ ฉันควรพยายามหลีกเลี่ยงหรือไม่
นั่นไม่เพียงพอที่จะรับรองความสมบูรณ์และความแข็งแกร่งของ JSF JSF เป็นเฟรมเวิร์กแบบไดนามิกที่มีจุดเข้าควบคุมจุดเดียว หากไม่มีการจัดการของรัฐหนึ่งจะสวมรอยสามารถ / สับร้องขอ HTTP ในวิธีการบางอย่าง (เช่นการจัดการกับdisabled
, readonly
และrendered
แอตทริบิวต์) เพื่อให้ JSF ทำสิ่งที่แตกต่างกันและอื่นอาจ hazardful- แม้จะมีแนวโน้มที่จะเกิดการโจมตี CSRF และฟิชชิง
และจะไม่ใช้หน่วยความจำมากเกินไปในฝั่งเซิร์ฟเวอร์หากมีเซสชันผู้ใช้หลายพันคนพร้อมกัน? ฉันมีแอปพลิเคชันที่ผู้ใช้สามารถโพสต์บล็อกในบางหัวข้อได้ บล็อกนี้มีขนาดค่อนข้างใหญ่ เมื่อจะมีการโพสต์กลับหรือขอดูบล็อกบล็อกขนาดใหญ่จะถูกบันทึกเป็นส่วนหนึ่งของสถานะของส่วนประกอบ สิ่งนี้จะใช้หน่วยความจำมากเกินไป นี่ไม่น่ากังวลเหรอ?
หน่วยความจำมีราคาถูกเป็นพิเศษ เพียงแค่ให้แอปเซิร์ฟเวอร์มีหน่วยความจำเพียงพอ หรือหากแบนด์วิดท์เครือข่ายถูกกว่าสำหรับคุณเพียงแค่เปลี่ยนสถานะการบันทึกเป็นฝั่งไคลเอ็นต์ ในการค้นหาคู่ที่ดีที่สุดเพียงแค่ stresstest และสร้างโปรไฟล์เว็บแอปของคุณด้วยจำนวนผู้ใช้พร้อมกันสูงสุดที่คาดไว้จากนั้นให้เซิร์ฟเวอร์แอปมากกว่า 125% ~ 150% ของหน่วยความจำที่วัดได้สูงสุด
โปรดทราบว่า JSF 2.0 ได้ปรับปรุงการจัดการสถานะเป็นอย่างมาก เป็นไปได้ที่จะบันทึกสถานะบางส่วน (เช่นเฉพาะสิ่งที่<h:form>
จะถูกบันทึกแทนที่จะเป็นข้อมูลทั้งหมดตั้งแต่ต้น<html>
จนจบ) ตัวอย่างเช่น Mojarra ทำเช่นนั้น รูปแบบเฉลี่ยที่มีช่องป้อนข้อมูล 10 ช่อง (แต่ละปุ่มมีป้ายกำกับและข้อความ) และ 2 ปุ่มจะใช้เวลาไม่เกิน 1 KB ด้วยการดู 15 ครั้งในเซสชันที่ไม่ควรเกิน 15 KB ต่อเซสชัน ด้วยเซสชันผู้ใช้ที่ใช้งานพร้อมกัน ~ 1,000 เซสชันไม่ควรเกิน 15MB
ข้อกังวลของคุณควรมุ่งเน้นไปที่วัตถุจริง (ถั่วที่มีการจัดการและ / หรือแม้แต่เอนทิตี DB) ในขอบเขตเซสชันหรือแอปพลิเคชัน ฉันเคยเห็นโค้ดและโปรเจ็กต์มากมายที่ทำซ้ำตารางฐานข้อมูลทั้งหมดโดยไม่จำเป็นลงในหน่วยความจำของ Java ในรูปแบบของเซสชันที่กำหนดขอบเขตซึ่ง Java ถูกใช้แทน SQL เพื่อกรอง / จัดกลุ่ม / จัดเรียงระเบียน ด้วย ~ 1000 บันทึกที่ได้อย่างง่ายดายจะไปมากกว่า 10MB ต่อเซสชันของผู้ใช้