เมื่อกำหนดค่าทรัพยากรเช่นแหล่งข้อมูลหรือเซิร์ฟเวอร์ FTP เราสามารถวางข้อมูลการกำหนดค่าเหล่านี้ลงในไฟล์แอตทริบิวต์ภายนอกอิสระและอ้างอิงรายการแอตทริบิวต์ในไฟล์แอตทริบิวต์ผ่านตัวยึดสถานที่เช่น $ {ผู้ใช้} และ $ {รหัสผ่าน} ในไฟล์การกำหนดค่าฤดูใบไม้ผลิ
การกำหนดค่านี้มีประโยชน์สองประการ:
ฤดูใบไม้ผลิให้ผู้จัดงาน PropertyPlaceHolderConfigurer ที่สามารถอ้างอิงไฟล์คุณสมบัติภายนอกเมื่อโหลดถั่ว PropertyPlaceHolderConfigurer ใช้อินเทอร์เฟซ BeanFactoryPostProcessorBean ดังนั้นจึงเป็น Postprocessor จากโรงงานถั่ว
1 ใบเสนอราคาพื้นฐาน
1.1 Method PropertyPlaceHolderConfigurer (การกำหนดค่า XML)
สมมติว่าคุณต้องกำหนดแหล่งข้อมูลในถั่ว:
<bean id = "dataSource" destroy-method = "close" p: driverclassname = "com.mysql.jdbc.driver" p: url = "jdbc: mysql: //127.0.0.1: 3306/spring4
ที่นี่ชื่อคลาสไดรเวอร์, URL JDBC และชื่อผู้ใช้และรหัสผ่านฐานข้อมูลถูกเขียนโดยตรงใน XML ด้วยวิธีนี้หากคุณต้องการเปลี่ยนข้อมูลการกำหนดค่าฐานข้อมูลระหว่างการปรับใช้คุณต้องค้นหา XML ก่อนแล้วแก้ไขซึ่งไม่สะดวก
ขอแนะนำให้แยกข้อมูลนี้ออกเป็นไฟล์กำหนดค่าโดยสมมติว่าชื่อคือ System.priperties:
driverclassName = com.mysql.jdbc.driverurl = jdbc: mysql: //127.0.0.1: 3306/spring4username = rootpassword =
ไฟล์แอตทริบิวต์สามารถกำหนดคุณลักษณะหลายอย่างและรูปแบบของแต่ละแอตทริบิวต์คือ:属性名=属性值
การกำหนดค่าสปริง:
<!-แนะนำไฟล์คุณสมบัติภายนอก-> <bean p: location = "classpath: system.properties" p: fileencoding = "utf-8"/> <!-แหล่งข้อมูล-> <bean id = "dataSource" ทำลาย-method = "ปิด" p: username = "$ {username}" p: password = "$ {รหัสผ่าน}"/>หลังจากการกำหนดค่านี้เราจะต้องให้ความสนใจกับไฟล์การกำหนดค่านี้เมื่อปรับใช้
PropertyPlaceHolderConfigurer คำอธิบายคุณสมบัติมีดังนี้:
| คุณสมบัติ | อธิบาย |
|---|---|
| ที่ตั้ง | ระบุพา ธ ไปยังไฟล์คุณสมบัติ |
| สถานที่ | ระบุพา ธ ไปยังไฟล์แอตทริบิวต์หลายไฟล์ |
| การเข้ารหัสไฟล์ | รูปแบบการเข้ารหัสของไฟล์ หากไม่ได้ระบุสปริงจะใช้รูปแบบการเข้ารหัสเริ่มต้นของระบบปฏิบัติการเพื่ออ่านเนื้อหาของไฟล์ |
| คำสั่ง | หาก PropertyPlaceHolderConfigurers หลายรายการถูกกำหนดไว้ในไฟล์การกำหนดค่าคุณสามารถระบุลำดับความสำคัญผ่านคุณสมบัตินี้ |
| ผู้ถือครองตำแหน่ง | คำต่อท้ายของตัวยึดค่าเริ่มต้นคือ $ { |
| สถานที่ | คำนำหน้าตัวยึดตำแหน่งค่าเริ่มต้นคือ} |
1.2 บริบท: เมธอด Property-PlaceHoder (การกำหนดค่า XML)
คุณสามารถใช้ namespace บริบทเพื่อกำหนดไฟล์คุณสมบัติซึ่งสง่างามกว่าวิธีการกำหนดค่าของ PropertyPlaceholderConfigurer
<บริบท: สถานที่ตั้งสถานที่ตั้งตำแหน่ง = "classpath: system.properties" การเข้ารหัสไฟล์ = "UTF-8"/>
แม้ว่าวิธีนี้จะต้องมีคุณสมบัติที่จะเข้ารหัสหรือฟังก์ชั่นขั้นสูงของการใช้ตารางฐานข้อมูลเพื่อบันทึกข้อมูลการกำหนดค่า PropertyPlaceHolderConfigurer จะต้องขยายออกไปจากนั้นใช้วิธีการกำหนดค่าถั่วที่กล่าวถึงก่อนหน้านี้
1.3 @Value Method (ขึ้นอยู่กับการกำหนดค่าคำอธิบายประกอบหรือการกำหนดค่าคลาส Java)
ถั่วที่มีคำอธิบายประกอบสามารถฉีดค่าคุณสมบัติลงในตัวแปรสมาชิกหรือวิธีการของถั่วที่มีคำอธิบายประกอบโดย @Value
@ComponentPublic คลาส CustomDataSource {@Value ("$ {driverclassName}") สตริงส่วนตัว driverclassName; @Value ("$ {url}") url สตริงส่วนตัว; @Value ("$ {ชื่อผู้ใช้}") ชื่อผู้ใช้สตริงส่วนตัว; @Value ("$ {รหัสผ่าน}") รหัสผ่านส่วนตัว; // ละเว้น getter/setter}คลาสที่ใส่คำอธิบายประกอบ @Configuration ตามคลาส Java เองที่มีคำอธิบายประกอบ @component ดังนั้นวิธีการอ้างอิงจึงเหมือนกับวิธีการอ้างอิงตามการกำหนดค่าคำอธิบายประกอบ
หมายเหตุ: ในระหว่างการใช้งานตรวจสอบให้แน่ใจว่ามีค่าแอตทริบิวต์อ้างอิงอยู่ในไฟล์แอตทริบิวต์และประเภทการจับคู่มิฉะนั้นจะมีการโยนข้อยกเว้น
2 ค่าแอตทริบิวต์การเข้ารหัส
สำหรับข้อมูลแอตทริบิวต์ที่ไม่รู้สึกมีเหตุผลที่จะปรากฏในข้อความธรรมดาในไฟล์แอตทริบิวต์ แต่ถ้าข้อมูลแอตทริบิวต์เป็นข้อมูลที่ละเอียดอ่อน (เช่นชื่อผู้ใช้และรหัสผ่านฐานข้อมูล ฯลฯ ) ขอแนะนำให้บันทึกไว้ใน CipherText เพราะหากข้อมูลที่ละเอียดอ่อนถูกจัดเก็บ ciphertext ใครก็ตามที่มีสิทธิ์เข้าสู่ระบบเซิร์ฟเวอร์อาจเห็นข้อมูลที่เป็นความลับซึ่งจะส่งผลกระทบต่อความปลอดภัยของระบบ
สำหรับระบบที่ต้องการข้อกำหนดด้านความปลอดภัยสูงโดยเฉพาะ (ธนาคารระบบความปลอดภัยสาธารณะ ฯลฯ ) ข้อมูลที่ละเอียดอ่อนนี้ควรอยู่ในมือของบุคลากรการบำรุงรักษาที่เฉพาะเจาะจงเพียงไม่กี่คนเท่านั้น ดังนั้นเราจำเป็นต้องเข้ารหัสข้อมูลนี้แล้วถอดรหัสไฟล์หลังจากคอนเทนเนอร์สปริงอ่านไฟล์
PropertyPlaceHolderConfigurer สืบทอดมาจากคลาส PlaceHolderConfigurersupport ซึ่งออกแบบวิธีการในการแปลงคุณสมบัติก่อนที่จะใช้:
| วิธี | อธิบาย |
|---|---|
| ConvertProperty (String PropertyName, String PropertyValue) | เมื่อมีการโหลดและอ่านค่าคุณสมบัติแต่ละวิธีวิธีนี้จะถูกเรียกให้แปลง |
| String ConvertProperTyValue (String OriginalValue) | มันคล้ายกับวิธีก่อนหน้ายกเว้นว่าพารามิเตอร์จะถูกส่งผ่านในค่าแอตทริบิวต์เท่านั้น |
| Void ConvertProperties (อุปกรณ์ประกอบฉาก) | แปลงค่าแอตทริบิวต์ทั้งหมด |
โดยค่าเริ่มต้นทั้งสามนี้เป็นวิธีที่ว่างเปล่า เราสามารถขยาย PropertyPlaceholderConfigurer เพื่อแทนที่วิธีการแปลงที่สอดคล้องกันซึ่งสนับสนุนไฟล์ค่าคุณสมบัติที่เข้ารหัส
2.1 คลาสเครื่องมือการเข้ารหัสและถอดรหัส DES
การเข้ารหัสข้อมูลแบ่งออกเป็นสองวิธี: สมมาตรและไม่สมมาตร Symmetrically หมายความว่าข้อมูลที่เข้ารหัสสามารถถอดรหัสได้ในขณะที่วิธีการไม่สมมาตรไม่สามารถถอดรหัสเป็นค่าดั้งเดิมตามข้อมูลที่เข้ารหัส MD5 เป็นของการเข้ารหัสแบบอสมมาตรและ DES เป็นของการเข้ารหัสแบบสมมาตร ดังนั้นที่นี่เราใช้ DES เพื่อเข้ารหัสค่าแอตทริบิวต์ เมื่ออ่านค่าแอตทริบิวต์จากนั้นใช้ DES เพื่อถอดรหัส
โปรดคลิกที่นี่สำหรับซอร์สโค้ดของเครื่องมือเข้ารหัสและถอดรหัส DES
คำแนะนำการเข้ารหัสและการถอดรหัส DES:
เราใช้เครื่องมือการเข้ารหัสและถอดรหัส DES เพื่อเข้ารหัสบัญชีฐานข้อมูลและรหัสผ่านผ่านบรรทัดคำสั่ง จากนั้นเขียนสตริงที่เข้ารหัสไปยัง System.properties ซึ่งเป็นดังนี้:
ชื่อผู้ใช้ = Q5L+2PPRSPQ = รหัสผ่าน = UDYJSVKXC/Q =
2.2 เข้ารหัสค่าของไฟล์แอตทริบิวต์
ขั้นแรกให้ปรับแต่งตัวกำหนดค่าแอตทริบิวต์ซึ่งรองรับการแปลงการถอดรหัส:
คลาสสาธารณะ CustomPropertyPlaceHolderConfigurer ขยาย PropertyPlaceHolderConfigurer { / *** คีย์ DES* / สตริงสุดท้ายคงที่ส่วนตัวคีย์ _str = "123456"; / *** ค่าชื่อคุณสมบัติที่เข้ารหัสของกลุ่ม*/ สตริงสุดท้ายคงที่สาธารณะ [] Encrypt_property_names = สตริงใหม่ [] {"ชื่อผู้ใช้", "รหัสผ่าน"}; @Override Protected String ConvertProperty (String PropertyName, String PropertyValue) {if (! isDecrypt (PropertyName)) {ส่งคืน PropertyValue; } // decrypt return ใหม่ des (key_str) .decrypt (PropertyValue); } / ** * จำเป็นหรือไม่ที่จะถอดรหัส * * @param propertyName propertyName propertyName * / บูลีนส่วนตัว iSdecrypt (สตริงอสังหาริมทรัพย์ชื่อ) {return arrayutils.contains (encrypt_property_names, PropertyName); -สังเกต:
จากนั้นกำหนดค่าไฟล์แอตทริบิวต์ที่กำหนดเองผ่าน <bean>:
<Bean P: location = "classpath: system.properties" p: fileencoding = "utf-8"/>
ด้วยวิธีนี้คอนเทนเนอร์สปริงสามารถโหลดไฟล์แอตทริบิวต์ที่เข้ารหัสได้ มันไม่ง่ายมากเหรอ?
o (∩_∩) โอฮ่าฮ่า ~
3 ใบเสนอราคาต่อตนเอง
สปริงอนุญาตให้อ้างอิงถึงค่าของแอตทริบิวต์ผ่าน $ {propname} ในคำจำกัดความถั่วและยังอนุญาตให้ใช้ $ {propname} เพื่อใช้การอ้างอิงร่วมกันระหว่างแอตทริบิวต์ในไฟล์คุณสมบัติ
ฐานข้อมูล = Spring4DriverClassName = com.mysql.jdbc.driverurl = jdbc: mysql: //127.0.0.1: 3306/$ {ฐานข้อมูล}ที่นี่ค่าของแอตทริบิวต์อื่น (ชื่ออินสแตนซ์ฐานข้อมูล) ถูกอ้างอิงผ่าน $ {ฐานข้อมูล} ดังนั้นสำหรับคุณสมบัติที่ซับซ้อนบางอย่างเราสามารถแยกการเปลี่ยนแปลงในคุณสมบัติด้วยวิธีนี้เพื่อลดการกำหนดค่า
หมายเหตุ: หากค่าคุณสมบัติยาวเกินไปเราสามารถเพิ่ม "/" ในตอนท้ายของแต่ละบรรทัดและแบ่งค่าคุณสมบัติเป็นหลายบรรทัดเช่นนี้:
profile.jdbc.url = jdbc: mysql: //127.0.0.1: 3306/dbname? useunicode = true & characterencoding/= utf-8/& zerodatetimebehavior = Converttonull
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น