1. Предисловие
Преимущество использования кодов проверки на страницах форм заключается в том, что оно эффективно не позволяет пользователям злонамеренно подавать формы или использование плагинов для незаконной атаки в систему.
2. Условия подготовки
1. Нормальный веб -проект веб -проекта;
2. Веб -сервер Tomcat.
3. Идеи реализации:
1. Настройте сервис VerifyCodeServlet, чтобы нарисовать изображение кода проверки, содержащее символы проверки. Картинки здесь должны быть нарисованы вручную с помощью Graphics2D;
2. Используйте SRC тега IMG, чтобы ссылаться на этот сервлет на конкретной странице, чтобы отобразить сервлет;
3. Поскольку информация о коде проверки помещается в сеанс при рисовании изображения, после отправки формы вы можете сравнить значение, сохраненное в сеансе с кодом, введенным пользователем, чтобы проверить, является ли ввод правильным.
Большинство кодов проверки, реализованных через сервлеты, реализованы в Интернете, и введена логика ниже:
шаг:
1. Случайно генерируйте строки кода проверки при запросе входа на страницу;
2. Храните сгенерированную строку кода проверки в сеансе;
3. Сгенерировать изображения кода проверки на основе строки кода проверки, а затем вывести изображения кода проверки для клиента для отображения;
4. Сравните строку кода проверки, введенную пользователем при отправке запроса входа в систему со строкой в сеансе.
4. Конкретный код заключается в следующем:
пакет com.servlet; импортировать java.awt.color; импортировать java.awt.font; импортировать java.awt.graphics2d; Импорт java.awt.image.bufferedImage; импортировать java.util.random; Импорт javax.imageio.imageio; Импорт javax.servlet.servletexception; импортировать javax.servlet.servletoutputstream; Импорт javax.servlet.http.httpservlet; Импорт javax.servlet.http.httpservletrequest; Импорт javax.servlet.http.httpservletresponse; Импорт javax.servlet.http.httpsession; / ** * Сервлет, который генерирует изображение кода проверки * @author Administrator * */ Public Class VerifyCodeservlet Extens Httpservlet {Private Static Long Long SerialVersionUID = -5051097528828603895L; /*** Ширина изображения кода проверки. */ частная ширина int = 100; /*** Высота изображения кода проверки. */ private int height = 30; / *** Количество символов кода проверки*/ private int CodeCount = 4; / *** Высота шрифта*/ private int fontheight; / *** Значение оси x первого символа, поскольку координаты следующих символов увеличиваются в последовательности, их значение оси x-кратный кодекс*/ private int codex; / *** Кодей, значение оси y уверенного символа, потому что значения одинаковы из-за параллелизма*/ private int codey; /** * codeSequence represents the sequence value that the characters are allowed to appear*/ char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; / *** Инициализировать атрибут изображения проверки*/ public void init () throws ServletException {// Получить начальную информацию из web.xml // string strwidth = this.getinitParameter ("width"); // высота строка strheight = this.getinitParameter ("высота"); // количество символов String strcodecount = this.getInitParameter ("CodeCount"); // Преобразовать настроенную информацию в числовой try {if (strwidth! = Null && strwidth.length ()! = 0) {width = integer.parseint (strwidth); } if (strheight! = null && strheight.length ()! = 0) {height = integer.parseint (strheight); } if (strcodecount! = null && strcodecount.length ()! = 0) {codecount = integer.parseint (strcodecount); }} catch (numberFormateXception e) {e.printStackTrace (); } // Ширина-4 Удалите избыточные левые и правые позиции, чтобы сделать код проверки более концентрированным, и чем больше вы его уменьшаете, тем более концентрированным он. // CodeCount+1 // Ракви-вариантное распределение отображаемой ширины, включая пробелы на левой и правой сторонах Codex = (ширина-4) /(CodeCount+1); // Высота - 10 Центрального дисплея код проверки fontheight = высота - 10; Codey = высота - 7; } /** * @param request * @param response * @throws ServletException * @throws java.io.IOException */ protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { // Define image buffer BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.type_int_rgb); Graphics2d gd = buffimg.creategraphics (); // Создать случайное генератор числа класс случайный случайный = new random (); // заполнить изображение как белый gd.setcolor (color.light_gray); Gd.FillRect (0, 0, ширина, высота); // Создать шрифт, размер шрифта должен быть определен в соответствии с высотой изображения. Font font = new Font ("fixedsys", font.plain, fontheight); // Установить шрифт. gd.setfont (шрифт); // нарисовать границы. gd.setcolor (color.black); gd.drawrect (0, 0, ширина - 1, высота - 1); // Случайно генерируют 160 интерференционных линий, делая код аутентификации на изображении, менее вероятно, будет обнаружено другими программами. Gd.setcolor (Color.gray); for (int i = 0; i <16; i ++) {int x = random.nextint (ширина); int y = random.nextint (высота); int xl = random.nextint (12); int yl = random.nextint (12); gd.drawline (x, y, x + xl, y + yl); } // случайный код используется для сохранения случайно сгенерированных кодов проверки, чтобы пользователь мог проверить после входа. int red = 0, green = 0, blue = 0; // Случайно генерирует код проверки для номера кодекса. для (int i = 0; i <codeCount; i ++) {// Получить случайно сгенерированный номер кода проверки. String strrand = string.valueof (codeSequence [random.nextint (36)]); // Сгенерировать случайные цветовые компоненты для построения значения цвета, так что значение цвета каждого цифрового выхода будет различным. red = random.nextint (255); green = random.nextint (255); blue = random.nextint (255); // Нарисуйте код проверки в изображение с помощью случайно сгенерированного цвета. Gd.setcolor (новый цвет (красный, зеленый, синий)); Gd.drawstring (Strrand, (i + 1) * Codex, Codey); // объединить сгенерированные четыре случайных числа вместе. randomcode.append (strrand); } // Сохранить четырехзначный код проверки в сеанс. Httpsession session = request.getsession (); session.setattribute ("validatecode", randomcode.tostring ()); // Кэш изображения запрещен. response.setheader ("pragma", "без Cache"); response.setheader («Контроль кэша», «без каша»); response.setDateHeader («истекает», 0); response.setContentType ("Image/jpeg"); // Вывод изображения в выходной поток сервлета. ServletOutputStream sos = response.getOutputStream (); Imageio.write (buffimg, "jpeg", sos); sos.close (); }}Затем настройте этот сервлет, который генерирует код проверки в web.xml, следующим образом:
<Servlet> <servlet-name> verifyCodeservlet </servlet-name> <servlet-class> com.servlet.verifycodeservlet </servlet-class> <init-param> <param-name> width </param-name> <param-value> 120 </param-value> </init-param> <inate-param> <param-name> nate> name </param-name> name> name> name> name> name> name> name> name> name> name </param-name> </init-param> <param-value> 32 </param-value> </init-param> <init-param> <param-name> codepray </param-name> <value> 4 </param-value> </init-param> </Servlet> <servlet-mapping> <servlet-name> verifycodeservlet </servlet-name> <urll-pattern> verifycodes-p-patternerserservlet </servlet-name> <urlle-patterner> </servlet-mapping>
Запустите сервер и введите в адресную строку браузера: http: // localhost: 8080/webproject/verifycodeservlet
Проверьте эффект отображения следующим образом:
1. Код проверки меняется каждый раз, когда вы обновляете код проверки, потому что сервлет должен отключить кеш браузера.
2. Здесь была найдена проблема: если вы используете браузер Firefox, переписываемый метод обслуживания в VerifyCodeservlet был выполнен дважды, и то же самое верно, если вы переписываете метод Конета или метод DoPost. И другие браузеры не видят этой ситуации. Позже было обнаружено, что если бы сервлет ссылался через страницу, было бы нормально назвать это.
Затем вы можете ссылаться на код проверки на странице, конкретный код заключается в следующем:
<%@ page language = "java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> <! doctype html public "-// w3c // dtd html 4.01 transitional // en" http://www.w3.org/tml4/html4/html. <html> <Head> <meta http-equiv = "content-type" content = "text/html; charset = iso-8859-1"> <title> вставьте заголовок здесь </title> </head> <body> <div> <% string inputcode = request.getparameter ("inputcode"); String verifyCode = (string) session.getAttribute ("validAteCode"); if (inputcode! = null && verifyCode! = null) {out.print ("Реальная проверка кода:" + verifycode + "<br/>" + "Код проверки пользователя:" + inputcode + "<br/>"); inputcode = inputcode.touppercase (); // case нечувствительный out.print («Сравните код проверки, чтобы доказать ввод пользователя» + (inputcode.equals (verifyCode)? } %> <form action = "index.jsp"> код проверки: <input name = "inputcode" value = "/> <img src =" verifycodeservlet "align =" middle "onclick =" javascript: rebresh (this); " onmouseover = "mouseover (this)"/> <br/> <input name = "prope" type = "prope" value = "sup"/> </form> </div> <script> function refresh (obj) {obj.src = "VerifyCodeServlet?" + Math.random (); } function mouseover (obj) {obj.style.cursor = "pointer"; } </script> </body> </html> Приведенный выше код подчиняет код проверки в текущий JSP через форму, чтобы проверить, является ли проверенный код, введенный пользователем. Конкретный эффект операции заключается в следующем:
1. Введите правильный код проверки
2. Введите неправильный код проверки