1. การเข้ารหัสอักขระแบบครบวงจรบนเว็บไซต์ทั้งหมด
พารามิเตอร์การกำหนดค่า charset ระบุว่าการเข้ารหัสอักขระใดที่ใช้ในการจัดการปัญหาภาษาจีนของพารามิเตอร์การร้องขอฟอร์ม HTML
แพ็คเกจ me.gacl.web.filter; นำเข้า java.io.ioexception; นำเข้า Javax.servlet.filter; นำเข้า Javax.servlet.filterchain; นำเข้า Javax.servlet.filterconfig; นำเข้า Javax.servlet.servletexception; javax.servlet.http.httpservletrequest; นำเข้า javax.servlet.http.httpservletrequestwrapper; นำเข้า Javax.servlet.http.httpservletResponse;/ *** @classname ตัวละครตัวละครใช้ตัวกรอง {private filterConfig filterConfig = null; // ตั้งค่าอักขระเริ่มต้นการเข้ารหัสสตริงส่วนตัว defaultCharSet = "UTF-8"; โมฆะสาธารณะ Dofilter (ServletRequest REQ, ServletResponse Resp, FilterChain Chain) พ่น IOException, ServleTexception {httpservletRequest Request = (httpservletRequest) req; httpservletResponse response = (httpservletResponse) resp; String charset = filterConfig.getInitParameter ("charset"); if (charset == null) {charset = defaultCharset; } request.Setcharacterencoding (charset); Response.Setcharacterencoding (Charset); Response.setContentType ("ข้อความ/html; charset ="+charset); MyCharacterenCodingRequest RequestWrapper = ใหม่ MyCharacterenCodingRequest (คำขอ); chain.dofilter (RequestWrapper, Response); } public void init (filterConfig filterConfig) พ่น servletexception {// รับข้อมูลการกำหนดค่าเริ่มต้นของตัวกรอง this.filterConfig = filterConfig; } โมฆะสาธารณะทำลาย () {}}/*1 ใช้อินเทอร์เฟซเดียวกันกับวัตถุที่ปรับปรุงแล้ว 2. กำหนดตัวแปรจำวัตถุที่ได้รับการปรับปรุง 3. กำหนดคอนสตรัคเตอร์เพื่อรับวัตถุขั้นสูง 4 เขียนทับวิธีที่ต้องปรับปรุง 5. สำหรับวิธีการที่ไม่ต้องการปรับปรุงโดยตรง สาธารณะ MyCharacterenCodingRequest (คำขอ httpservletRequest) {super (คำขอ); this.request = คำขอ; } /* วิธีการเขียนใหม่ getParameter* @see javax.servlet.servletRequestwrapper#getParameter (java.lang.string)* /@Override สตริงสาธารณะ getParameter (ชื่อสตริง) {ลอง {// รับค่าสตริงของพารามิเตอร์ if (value == null) {return null; } // หากข้อมูลไม่ได้ส่งใน GET ให้ส่งคืนค่าที่ได้รับโดยตรงถ้า (! this.request.getMethod (). equalsignorecase ("รับ")) {ค่าคืน; } else {// ถ้าข้อมูลถูกส่งใน GET ค่าที่ได้รับคือค่า transcoded = สตริงใหม่ (value.getBytes ("ISO8859-1"), this.request.getCharacterencoding ()); ค่าส่งคืน; }} catch (exception e) {โยน runtimeException ใหม่ (e); - การกำหนดค่าในไฟล์ web.xml มีดังนี้:
<silter> <melter-Name> ตัวอักษร </filter-name> <silter-class> me.gacl.web.filter.characterencodingFilter </filter-class> <init-param> <Stilter-Name> ตัวละคร actialEncodingFilter </filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
2. ห้ามใช้เบราว์เซอร์จากหน้าไดนามิกทั้งหมด
มีฟิลด์ส่วนหัวตอบกลับ HTTP 3 ฟิลด์ที่สามารถห้ามไม่ให้เบราว์เซอร์ไม่ให้แคชหน้าปัจจุบัน รหัสตัวอย่างใน servlet มีดังนี้:
ไม่ใช่เบราว์เซอร์ทั้งหมดที่สามารถรองรับส่วนหัวการตอบกลับสามข้อข้างต้นได้อย่างเต็มที่ดังนั้นจึงเป็นการดีที่สุดที่จะใช้ส่วนหัวตอบกลับสามข้อข้างต้นในเวลาเดียวกัน
แพ็คเกจ me.gacl.web.filter; นำเข้า java.io.ioexception; นำเข้า Javax.servlet.filter; นำเข้า Javax.servlet.filterchain; นำเข้า Javax.servlet.filterconfig; นำเข้า Javax.servlet.servletexception; javax.servlet.http.httpservletrequest; นำเข้า javax.servlet.http.httpservletResponse;/ *** @classname: nocachefilter* @description: Browser ถูกห้ามไม่ให้แคช Class Nocachefilter ใช้ตัวกรอง {โมฆะสาธารณะ dofilter (ServletRequest req, servletResponse resp, filterchain chain) พ่น ioexception, servletexception {// บังคับให้ servletrequest httpservletRequest httpservletrequest request = // บังคับให้ servletResponse ไปยัง httpservletResponse httpservletResponse response = (httpservletResponse) resp; // บังคับให้ servletResponse ไปยัง httpservletResponse response = (httpservletResponse) resp; // ห้ามใช้เบราว์เซอร์ให้แคชการตอบสนองแบบไดนามิกทั้งหมด SetDateHeader ("Expires", -1); Response.Setheader ("แคชควบคุม", "ไม่มีแคช"); Response.Setheader ("Pragma", "No-cache"); chain.dofilter (คำขอ, การตอบกลับ); } public void init (filterConfig filterConfig) พ่น servletexception {} โมฆะสาธารณะทำลาย () {}} การกำหนดค่าในไฟล์ web.xml มีดังนี้:
<silter> <filter-name> nocachefilter </filter-name> <filter-class> me.gacl.web.filter.nocachefilter </filter-class> </filter> <filter-mapping> <filter-name> </ตัวกรองการทำแผนที่>
3. การควบคุมทรัพยากรคงที่ในหน้าแคชเบราว์เซอร์
บางหน้าแบบไดนามิกอ้างถึงรูปภาพหรือไฟล์ CSS บางไฟล์เพื่อแก้ไขเอฟเฟกต์หน้า ไฟล์รูปภาพและ CSS เหล่านี้มักจะไม่เปลี่ยนแปลงดังนั้นเพื่อลดแรงกดดันบนเซิร์ฟเวอร์คุณสามารถใช้ตัวกรองเพื่อควบคุมเบราว์เซอร์เพื่อแคชไฟล์เหล่านี้เพื่อปรับปรุงประสิทธิภาพของเซิร์ฟเวอร์
แพ็คเกจ me.gacl.web.filter; นำเข้า java.io.ioexception; นำเข้า Javax.servlet.filter; นำเข้า Javax.servlet.filterchain; นำเข้า Javax.servlet.filterconfig; นำเข้า Javax.servlet.servletexception; javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse;/ *** @classname: cachefilter*@description: ตัวกรอง*/ คลาสสาธารณะ โมฆะสาธารณะ Dofilter (ServletRequest REQ, ServletResponse Resp, FilterChain Chain) พ่น IOException, ServleTexception {httpservletRequest Request = (httpservletRequest) req; httpservletResponse response = (httpservletResponse) resp; // 1. รับทรัพยากรที่ผู้ใช้ต้องการเข้าถึงสตริง uri = request.getRequesturi (); // 2. รับชื่อต่อท้ายของทรัพยากรที่ผู้ใช้ต้องการเข้าถึงสตริง ext = uri.substring (uri.lastindexof (".")+1); // รับเวลาที่ทรัพยากรต้องเป็นสตริงแคช = FilterConfig.getInitParameter (ext); ถ้า (เวลา! = null) {long t = long.parselong (เวลา)*3600*1000; // ตั้งค่าการตอบสนองแคช SetDateHeader ("Expires", System.currentTimeMillis () + T); } chain.dofilter (คำขอ, การตอบกลับ); } public void init (filterConfig filterConfig) พ่น servletexception {this.filterConfig = filterConfig; } โมฆะสาธารณะทำลาย () {}} การกำหนดค่าในไฟล์ web.xml มีดังนี้:
<!-กำหนดค่าตัวกรองแคช-> <filter> <filter-name> cachefilter </filter-name> <silter--class> me.gacl.web.filter.cachefilter </filter-class> <!-กำหนดค่าทรัพยากรเว็บให้แคช <param-value> 4 </param-value> </init-param> <init-param> <param-name> jpg </param-name> <param-value> 1 </param-value> </init-param> <init-Param> <param-name> png </param-name> <param-value> 4 </param-value> </init-param> </filter> <!-กำหนดค่าคำต่อท้ายของเว็บทรัพยากรที่จะถูกแคช-> <filter-mapping> <filter-name> cachefilter < <Tilter-Name> CACHEFILTER </filter-Name> <url-Pattern>*. CSS </url-pattern> </ตัวกรอง-การแม็ก> <filter-mapping> <filter-name> cachefilter </filter-name> <url-pattern>*. <Tilter-Name> CACHEFILTER </filter-name> <url-pattern>*. png </url-pattern> </ตัวกรอง-การแมป>
4. ตระหนักถึงการเข้าสู่ระบบอัตโนมัติสำหรับผู้ใช้
แนวคิดมีดังนี้:
1. หลังจากผู้ใช้เข้าสู่ระบบสำเร็จให้ส่งคุกกี้พร้อมผู้ใช้ชื่อไปยังไคลเอนต์ ค่าของคุกกี้คือชื่อผู้ใช้และรหัสผ่านที่เข้ารหัสของ MD5
2. เขียน AutologinFilter ตัวกรองนี้ตรวจสอบว่าผู้ใช้มีคุกกี้ชื่อผู้ใช้หรือไม่ ถ้าเป็นเช่นนั้นโทรหา DAO เพื่อตรวจสอบว่าชื่อผู้ใช้และรหัสผ่านของคุกกี้ตรงกับฐานข้อมูลหรือไม่ หากการจับคู่เสร็จสิ้นวัตถุผู้ใช้ (เช่นเครื่องหมายล็อกอินผู้ใช้) จะถูกเก็บไว้ในเซสชันเพื่อให้ได้การเข้าสู่ระบบอัตโนมัติ
รหัสหลักมีดังนี้:
ตัวควบคุมการจัดการเข้าสู่ระบบของผู้ใช้: LoginServlet
แพ็คเกจ me.gacl.web.controller; นำเข้า java.io.ioexception; นำเข้า Javax.servlet.servletexception; นำเข้า Javax.servlet.http.cookie; นำเข้า Javax.servlet.http.httpservlet; javax.servlet.http.httpservletResponse; นำเข้า me.gacl.dao.userdao; นำเข้า me.gacl.domain.user; นำเข้า me.gacl.util.webutils; ServleTexception, iOexception {String username = request.getParameter ("ชื่อผู้ใช้"); สตริงรหัสผ่าน = request.getParameter ("รหัสผ่าน"); userdao dao = ใหม่ userdao (); ผู้ใช้ผู้ใช้ = dao.find (ชื่อผู้ใช้รหัสผ่าน); ถ้า (user == null) {request.setAttribute ("ข้อความ", "ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง !!"); request.getRequestDispatcher ("/message.jsp") ส่งต่อ (คำขอ, การตอบกลับ); กลับ; } request.getSession (). setAttribute ("ผู้ใช้", ผู้ใช้); // ส่งคุกกี้เข้าสู่ระบบอัตโนมัติไปยังเบราว์เซอร์ไคลเอนต์เพื่อจัดเก็บ sendautologincookie (คำขอการตอบกลับผู้ใช้); request.getRequestDispatcher ("/index.jsp") ส่งต่อ (คำขอ, การตอบกลับ); } / ** * @method: sendautologincookie * @description: ส่งคุกกี้เข้าสู่ระบบอัตโนมัติไปยังเบราว์เซอร์ไคลเอนต์ * @param Request * @param Response * @param ผู้ใช้ * / โมฆะส่วนตัว sendautologincookie (httpservlet logintime = integer.parseint (request.getParameter ("logintime")); // สร้างคุกกี้ชื่อของคุกกี้คือ autologin ค่าคือชื่อผู้ใช้และรหัสผ่านของการเข้าสู่ระบบของผู้ใช้และใช้ระหว่างชื่อผู้ใช้และรหัสผ่าน มันถูกแบ่งออก รหัสผ่านถูกเข้ารหัสโดย MD5 คุกกี้ = คุกกี้ใหม่ ("autologin", user.getUserName () + "." + webUtils.md5 (user.getPassword ())); // ตั้งค่าระยะเวลาความถูกต้องของคุกกี้คุกกี้ SetMaxage (Logintime); // ตั้งค่าเส้นทางที่ถูกต้องของคุกกี้คุกกี้ SetPath (request.getContextPath ()); // เขียนคุกกี้ไปยังเบราว์เซอร์ไคลเอ็นต์ Response.addcookie (คุกกี้); }} โมฆะสาธารณะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {doget (คำขอ, การตอบกลับ); - ตัวกรองที่จัดการการเข้าสู่ระบบอัตโนมัติของผู้ใช้: AutologInFilter
แพ็คเกจ me.gacl.web.filter; นำเข้า java.io.ioexception; นำเข้า Javax.servlet.filter; นำเข้า Javax.servlet.filterchain; นำเข้า Javax.servlet.filterconfig; นำเข้า Javax.servlet.servletexception; javax.servlet.http.cookie; นำเข้า javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletresponse; นำเข้า me.gacl.dao.userdao; AutologinFilter ใช้ตัวกรอง {โมฆะสาธารณะ dofilter (ServletRequest req, servletResponse resp, filterchain chain) พ่น IOException, servletexception {httpservletRequest request = (httpservletRequest) req; httpservletResponse response = (httpservletResponse) resp; // หากคุณเข้าสู่ระบบ, chain.dofilter โดยตรง (คำขอ, การตอบกลับ) รีลีสถ้า (request.getSession (). getAttribute ("ผู้ใช้")! = null) {chain.dofilter (คำขอ, การตอบสนอง); กลับ; } // 1 รับคุกกี้ของ authlogin ที่นำโดยค่าสตริงผู้ใช้ = null; คุกกี้คุกกี้ [] = request.getCookies (); สำหรับ (int i = 0; คุกกี้! = null && i <cookies.length; i ++) {ถ้า (คุกกี้ [i] .getName (). เท่ากับ ("autologin")) {value = cookies [i] .getValue (); }} // 2 รับชื่อผู้ใช้และรหัสผ่านในคุกกี้ถ้า (value! = null) {string username = value.split ("//.") [0]; สตริงรหัสผ่าน = value.split ("//.") [1]; // 3. โทรหา DAO เพื่อรับรหัสผ่านที่สอดคล้องกันของผู้ใช้ผู้ใช้ dao = ใหม่ userdao (); ผู้ใช้ผู้ใช้ = dao.find (ชื่อผู้ใช้); สตริง dbpassword = user.getPassword (); // 4. ตรวจสอบว่ารหัสผ่านของ MD5 นำโดยผู้ใช้ตรงกับรหัสผ่านในฐานข้อมูลหรือไม่ หากตรงกับมันจะเข้าสู่ระบบโดยอัตโนมัติหาก (password.equals (webutils.md5 (dbpassword))) {request.getSession () SetAttribute ("ผู้ใช้" ผู้ใช้); }} chain.dofilter (คำขอ, การตอบกลับ); } โมฆะสาธารณะทำลาย () {} public void init (filterConfig filterConfig) พ่น servletexception {}} หากคุณต้องการยกเลิกการเข้าสู่ระบบอัตโนมัติคุณสามารถลบคุกกี้เข้าสู่ระบบอัตโนมัติเมื่อผู้ใช้ออกจากระบบ รหัสหลักมีดังนี้:
แพ็คเกจ me.gacl.web.controller; นำเข้า java.io.ioexception; นำเข้า Javax.servlet.servletexception; นำเข้า Javax.servlet.http.cookie; นำเข้า Javax.servlet.http.httpservlet javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; คลาสสาธารณะ cancelautologinservlet ขยาย httpservlet {public void doget (httpservletrequest คำขอ request.getSession (). RemoveAttribute ("ผู้ใช้"); // ลบคุกกี้ที่เข้าสู่ระบบโดยอัตโนมัติ removeautologincookie (คำขอ, การตอบกลับ); // ลบไปยังหน้าเข้าสู่ระบบหลังจากออกจากระบบ request.getRequestDispatcher ("/login.jsp"). forward (คำขอ, การตอบกลับ); } /** * @method: RemoveAutologincookie * @description: ลบคุกกี้เข้าสู่ระบบอัตโนมัติ * วิธีที่จะลบคุกกี้ใน Javaweb คือการสร้างคุกกี้ใหม่คุกกี้ที่สร้างขึ้นใหม่มีชื่อเหมือนคุกกี้ @Param Request * @Param Response */โมฆะส่วนตัว removeAutologincookie (คำขอ httpservletrequest, httpservletResponse ตอบสนอง) {// สร้างคุกกี้ที่มีชื่อคุกกี้ Autologin = คุกกี้ใหม่ ("Autologin", "); // กำหนดระยะเวลาที่ถูกต้องของคุกกี้ Cookie.SetPath (request.getContextPath ());ข้างต้นเป็นสถานการณ์แอปพลิเคชันทั่วไปหลายประการของตัวกรองและฉันหวังว่าพวกเขาจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคน