ในชีวิตของเรามันเป็นเรื่องธรรมดามากสำหรับการเข้าสู่ระบบโดยอัตโนมัติไปยังบัญชีดังนั้นเราจึงใช้ตัวกรองเพื่อใช้ฟังก์ชั่นนี้
ส่วนใหญ่จะแนะนำการเข้าสู่ระบบอัตโนมัติของผู้ใช้และการเข้าสู่ระบบอัตโนมัติที่ถูกยกเลิกเช่นเดียวกับการรับรู้การเข้าสู่ระบบอัตโนมัติในหนึ่งวันหรือ n วัน หลังจากเพิ่ม IP ของผู้ใช้ในบัญชีดำแล้วจะใช้ตัวกรองโดยตรงเพื่อกลับไปที่หน้าคำเตือน
ฟังก์ชั่นของตัวกรองนั้นทรงพลังมาก เราต้องเพิ่มเซิร์ฟเล็ตหลังจากแบ็กเอนด์ส่วนหน้าเป็นลายลักษณ์อักษรเพื่อรับรู้ฟังก์ชั่นนี้
PS: นี่เป็นเพียงการสาธิต ฉันจำลองส่วนหนึ่งของฐานข้อมูลการเข้าถึงด้วยตัวเองโดยส่วนใหญ่มุ่งเน้นไปที่การรับรู้ฟังก์ชั่นการเข้าสู่ระบบอัตโนมัติ
รหัสแผนกต้อนรับ:
ไม่ว่ารหัสเบื้องหน้าจะสำเร็จหรือไม่แสดงในหน้านี้ เทคนิคที่ใช้: แอปพลิเคชันของแท็ก JSTL, ค่าการอ่านเซสชัน
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c"%> <html> <head> </head> <body> <c: ถ้า test = "$ {! sessionscope.error}"> รหัสผ่านหรือชื่อผู้ใช้ของคุณผิด <!-หลังจากแสดงคุณต้องลบค่าภายใน-> <c: ลบ var = "ข้อผิดพลาด" scope = "เซสชัน"/> </c: ถ้า> <c: ถ้าทดสอบ = "$ {เซสชันว่างเปล่า. user}" var = "boo"> <h2> type = "text" name = "name" /> <br/> pwd: <อินพุต type = "text" name = "pwd" /> <br/> ไม่เข้าสู่ระบบโดยอัตโนมัติ: <อินพุต type = "Radio" name = "time" value = "0" /> <br/> /> <br/> <อินพุต type = "subment" value = "ส่ง"/> </form> </c: ถ้า> <c: ถ้า test = "$ {! boo}"> ยินดีต้อนรับ $ {sessionscope.user} เข้าสู่ระบบ <a href = ""> โมดูล 1 </a> value = '/cancelautologin' //> "> cancelautologin </a> </c: ถ้า> </body> </html>รหัสการใช้งานของ servlet:
เช่นเดียวกับรหัสก่อนหน้านี้มีหน้าที่เฉพาะในการโต้ตอบกับแผนกต้อนรับ: เทคโนโลยีที่ใช้ในนั้นรวมถึงการเข้ารหัส URL ค่าอยู่ในคุกกี้เซสชันอยู่ในหน้าและหน้าถูกกระโดด (ส่งต่อ)
โมฆะสาธารณะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {string name = request.getParameter ("ชื่อ"); สตริง pwd = request.getParameter ("PWD"); String time = request.getParameter ("เวลา"); if (name! = null && pwd! = null && name.equals (pwd)) {// เขียนที่นี่ตามที่คุณต้องการคุณควรไปที่บริการ-> dao เพื่อเข้าถึงฐานข้อมูลในภายหลัง // สมมติว่าการเข้าสู่ระบบประสบความสำเร็จ // เข้ากันได้กับภาษาจีนเราต้องเข้ารหัสชื่อ = urlencoder.encode (ชื่อ, "UTF-8"); pwd = urlencoder.encode (PWD, "UTF-8"); คุกกี้ c = คุกกี้ใหม่ ("autologin", ชื่อ+","+pwd); // ค่านี้ไม่สามารถใช้ด้วยวิธีนี้ สำหรับการพิจารณาด้านความปลอดภัยเราต้องรู้ว่าใช้การเข้ารหัสหรือการเข้ารหัสรอง, int _time = 60*60*24*จำนวนเต็ม ValueOf (เวลา); C.SetMaxage (_time); Response.addcookie (C); Response.Sendredirect (request.getContextPath ()+"/index.jsp"); // การตั้งค่าเริ่มต้นในตัวกรองคือการสกัดกั้นการเปลี่ยนเส้นทางและการส่งต่อเป็นการส่งต่อภายในโดยตรง อย่างไรก็ตามตัวกรองไม่ใช่เรื่องง่ายที่จะจัดการ แต่คุณต้องกำหนดค่าใน web.xml เท่านั้น } else {request.getSession (). setAttribute ("ข้อผิดพลาด", "1"); Response.Sendredirect (request.getContextPath ()+"/index.jsp"); -จนถึงตอนนี้ฉันรู้สึกว่าไม่มีเทคโนโลยี รหัสเดียวกันกับรหัสก่อนหน้านี้เป็นฟังก์ชันของตัวกรอง
เข้าสู่ระบบอย่างปลอดภัย:
เราใช้การนำเข้าแบบไดนามิกเพื่อเข้าสู่ระบบอย่างปลอดภัยมาก่อนเพื่อป้องกันไม่ให้ผู้ใช้เข้าสู่ระบบโดยไม่ต้องเข้าสู่ระบบหลังจากเข้าสู่โครงการ คุณสามารถป้อนอินเทอร์เฟซตามที่จะเข้าสู่โครงการ การนำเข้าแบบไดนามิกสามารถบรรลุฟังก์ชั่นนี้ได้ แต่จะดีกว่าที่จะใช้ตัวกรอง
โดยทั่วไป Dofilter () เขียนไว้ในตัวกรอง คุณจะต้องพิจารณาว่าคอนเทนเนอร์เซสชันนั้นเป็นโมฆะหรือไม่ ซึ่งหมายความว่านี่ไม่ได้เข้าสู่ระบบเพียงแค่เตะกลับไปที่อินเตอร์เฟสเข้าสู่ระบบ มิฉะนั้นปล่อยมันไป
นำเสนอรหัส:
โมฆะสาธารณะ Dofilter (คำขอ ServletRequest, การตอบสนอง servletResponse, ห่วงโซ่ FilterChain) พ่น IOException, servletexception {httpservletRequest req = (httpservletrequest) คำขอ; httpservletResponse resp = (httpservletResponse) การตอบสนอง; string session = (String) req.getSession (). getAttribute ("ผู้ใช้"); if (session == null) {system.out.println ("การเข้าสู่ระบบผิดปกติ"); resp.sendredirect (req.getContextPath ()+"/index.jsp"); } else {system.out.println ("ประสบความสำเร็จในการเข้าสู่ระบบ"); chain.dofilter (req, resp); -การเข้ารหัสอักขระ:
ปัญหาของการเข้ารหัสอักขระ ในอดีตฉันต้องป้อนด้วยตนเองใน dopost () ของ servlet ทุกครั้งคำขอ setcharacterencoding ("UTF-8"); servlet ทุกคนต้องการอินพุตซึ่งลำบากเกินไปดังนั้นเราจึงใช้ตัวกรองเพื่อนำไปใช้
นำเสนอรหัส:
<span style = "ตัวอักษรขนาด: 18px;"> โมฆะสาธารณะ dofilter (คำขอ servletrequest, การตอบสนอง servletresponse, โซ่ฟิลเตอร์เชน) โยน ioexception, servletexception {request.setcharacterencoding (อักขระ); // ลบการเข้ารหัสที่ได้รับจากไคลเอนต์ chain.dofilter (คำขอ, การตอบกลับ); } @Override โมฆะสาธารณะ init (filterConfig config) พ่น servletexception {character = config.getInitParameter ("ตัวละคร"); // a </span> <span style = "ตัวอักษรขนาด: 18px; Font-family: Arial, Helvetica, Sans-Serif; } </span>อักขระด้านบนถูกกำหนดให้เป็นตัวแปรส่วนกลางและค่าเริ่มต้นจะถูกกำหนดค่าใน web.xml
นำเสนอรหัส web.xml:
<filter> <filter-name> อักขระ </filter-name> <s Filter-Class> cn.hncu.filter.characterfilter </filter-class> <init-param> <param-name> อักขระ </param-name>
เข้าสู่ระบบอัตโนมัติ:
แนวคิดหลัก: การเข้าสู่ระบบอัตโนมัติต้องการการพิจารณาว่าเซสชันมีค่า หากมีหลังจากเข้าสู่ระบบหากไม่มีให้ไปที่คุกกี้ท้องถิ่นเพื่อค้นหามีอยู่และจับคู่ฐานข้อมูล หากการแข่งขันสำเร็จให้เพิ่มคอนเทนเนอร์เซสชัน
นำเสนอรหัส:
โมฆะสาธารณะ Dofilter (คำขอ ServletRequest, การตอบสนอง servletResponse, ห่วงโซ่ฟิลเตอร์เชน) โยน ioexception, servletexception {// เข้าสู่ระบบโดยอัตโนมัติคุณต้องตั้งค่าว่ามีค่าในเซสชัน หากมีคุณได้ลงชื่อเข้าใช้และไม่คุณต้องเข้าถึงข้อมูลในคุกกี้ ข้อมูลในคุกกี้ // ข้อมูลในฐานข้อมูลตรงกับฐานข้อมูลหรือไม่? ใช่ตั้งค่าในเซสชันที่นี่ไม่ปล่อยให้ httpservletrequest req = (httpservletrequest) คำขอ; httpservletResponse resp = (httpservletResponse) การตอบสนอง; string session = (String) req.getSession (). getAttribute ("ผู้ใช้"); if (session == null) {// ระบุว่าไม่มีคุกกี้ใด ๆ ที่ลงชื่อเข้าใช้ในปัจจุบัน cs [] = req.getCookies (); if (cs! = null) {สำหรับ (คุกกี้ C: CS) {ถ้า (c.getName (). เท่ากับ ("autologin")) {ค่าสตริง = c.getValue (); // นี่คือการเข้ารหัส แต่เราเพิ่งเชื่อมต่อกับเครื่องหมายจุลภาค String [] strs = value.split (","); // ใน LogSerLvet เราใช้การเข้ารหัสก่อนแล้วการเชื่อมต่อเครื่องหมายจุลภาค เราจำเป็นต้องย้อนกลับชื่อสตริง = urldecoder.decode (strs [0], "UTF-8"); String pwd = urldecoder.decode (strs [1], "UTF-8"); // รับชื่อข้อมูล PWD ไปยังพื้นหลังเพื่อเข้าถึงฐานข้อมูลเราเพิ่งเขียนว่า (name.equals (pwd)) {req.getSession (). setAttribute ("ผู้ใช้", ชื่อ); // ตั้งค่าพารามิเตอร์ในเซสชัน; }}}}} chain.dofilter (req, resp); // คุณต้องปล่อยไป - -ผู้ใช้ที่ขึ้นบัญชีดำ
ผู้ใช้ที่ขึ้นบัญชีดำไม่เข้าสู่ระบบเพียงแค่บอกผลลัพธ์ให้พวกเขา
นำเสนอรหัส:
โมฆะสาธารณะ Dofilter (คำขอ ServletRequest, การตอบสนอง servletResponse, ห่วงโซ่ FilterChain) พ่น IOException, servletexception {httpservletRequest req = (httpservletrequest) คำขอ; httpservletResponse resp = (httpservletResponse) การตอบสนอง; string ip = req.getRemoteaddr (); // รับ ip เข้าถึง; System.out.println (IP+"IIPP"); if (set.contains (IP)) {// ภายใน BlackList System.out.println ("set"); resp.getWriter (). พิมพ์ ("คุณอยู่ในบัญชีดำ .. <a href = '"+req.getContextPath ()+"/index.jsp'> return </a>"); // return เป็นไปไม่ได้เนื่องจากดัชนีจะสกัดกั้นโดยตรงเมื่อร้องขอจากเซิร์ฟเวอร์} else {chain.dofilter (req, resp); - ประเภทที่ส่งคืนโดยบัญชีดำนั้นดีที่สุด ฉันเพิ่มด้วยตนเองที่นี่ ตอนแรกฉันควรอ่านจากฐานข้อมูลโดยการเขียนคลาสเครื่องมือ ไม่เพียง แต่สามารถตรวจสอบได้ แต่ยังเพิ่มลบและแก้ไข - บัญชีดำ
นำเสนอรหัส:
HashSet ถูกกำหนดให้เป็นตัวแปรทั่วโลกและชุดประกอบด้วยประกอบด้วยซึ่งมีประสิทธิภาพมาก
Public Void Init (FilterConfig Arg0) พ่น ServleTexception {// นี่คือรายการบัญชีดำที่ดึงมาจากฐานข้อมูล นี่เป็นเพียงชุดการจำลองแบบง่าย ๆ ADD ("192.132.0.12"); // นี่คือ IP สีดำซึ่งได้มาจากฐานข้อมูลพื้นหลัง set.add ("localhost"); set.add ("192.132.32.4"); set.add ("127.0.0.1"); -ยกเลิกการเข้าสู่ระบบอัตโนมัติ
เมื่อการเข้าสู่ระบบอัตโนมัติถือว่าไม่ปลอดภัยเสมอเราจะตั้งค่าว่าไม่มีการเข้าสู่ระบบอัตโนมัติ
เรารู้ก่อนหน้านี้ว่าการเข้าสู่ระบบอัตโนมัติขึ้นอยู่กับเทคโนโลยีที่เก็บไว้ในคุกกี้ดังนั้นที่นี่เราต้องลบคุกกี้เท่านั้น
เนื่องจากการยกเลิกการเข้าสู่ระบบอัตโนมัติเป็นการเชื่อมโยงหลายมิติจึงถูกเขียนเป็น servlet
นำเสนอรหัส:
โมฆะสาธารณะ dopost (httpservletrequest req, httpservletresponse resp) พ่น servletexception, ioexception {คุกกี้ cc = คุกกี้ใหม่ ("autologin", ""); // วิธีการลบคุกกี้คือการสร้าง connkie ด้วยชื่อเดียวกัน CC.SetMaxage (0); CC.SetPath (req.getContextPath ()); resp.addcookie (CC); resp.sendredirect (req.getContextPath ()+"/index.jsp"); -ข้างต้นสามารถตระหนักถึงฟังก์ชั่นคำตอบสั้น ๆ เหล่านี้
ข้างต้นเป็นคำอธิบายโดยละเอียดเกี่ยวกับความรู้ที่เกี่ยวข้องที่แนะนำโดยตัวแก้ไขไปยัง Javaee โดยใช้ตัวกรองเพื่อให้ได้การเข้าสู่ระบบอัตโนมัติและการเข้าสู่ระบบที่ปลอดภัยเพื่อยกเลิกการเข้าสู่ระบบอัตโนมัติ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!