Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.01.2012, 22:20
Новичок на форуме
Отправить личное сообщение для psarum Посмотреть профиль Найти все сообщения от psarum
 
Регистрация: 01.01.2012
Сообщений: 6

Преобразовать поток в картинку при обновление капчи
Всем привет.
Использую JSP c javascript.
В моём проекте есть форма авторизации с капчой.
Задача - сделать обновление капчи средствами AJAX, то есть без обновления страницы.
Проблема возникает при попытке преобразовать потоковый ответ сервера в картинку.
Итак
На клиенте кнопочка обновления капчи вызывает:
function getCaptcha() {
            var params = 'id=' + Math.random();
            http.open("POST", "CaptchaServlet", true);
            http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            http.setRequestHeader("Content-length", params.length);
            http.setRequestHeader("Connection", "close");
            http.onreadystatechange = function () {
                if (http.readyState == 4 && http.status == 200) {
                    var my_image = http.responseText;
                    alert(my_image);
                    document.getElementById('captchaImg').src = "data:image/jpeg;base64," + my_image;
                }
            };
            http.send(params);


Алерт исправно выдаёт ответ сервера, то есть сервер картинку отдаёт.

на сервере данный запрос обрабатывает сервлет с кодом:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            Captcha captcha = new Captcha.Builder(200, 50).addText(new DefaultTextProducer()).gimp(new DropShadowGimpyRenderer()).build();
            response.setHeader("Cache-Control", "no-store");
            response.setHeader("Pragma", "no-cache");
            response.setDateHeader("Expires", 0);
            response.setContentType("image/jpeg");
            CaptchaServletUtil.writeImage(response, captcha.getImage());
            request.getSession().setAttribute("CorrectAnswer",captcha.getAnswer());
        } catch (Exception e) {
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        }
    }



Воть...
Подскажите выход из положения.
Если есть варианты других решений, опишите пожалуйста.
Ответить с цитированием
  #2 (permalink)  
Старый 01.01.2012, 22:25
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Просто откажитесь от малость странной идеи POST-обращения к рисунку капчи, и обновляйте капчу, как все нормальные люди:
document.getElementById('captchaImg').src = 'CaptchaServlet?id=' + Math.random();
Ответить с цитированием
  #3 (permalink)  
Старый 01.01.2012, 22:33
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Немного замечаний по остальному коду
Сообщение от psarum
var params = 'id=' + Math.random();
Зачем вы добавляете случайный POST-запрос при запросе картинки с капчей?
Может быть в этом есть какой-то сакральный смысл, и так и вправду нужно сделать в вашем проекте, но скорее всего, вы просто прочитали статью про кеширование браузером, и не до конца ее поняли.
Для того, чтобы браузер не кешировал файлы надо(вернее это один из способов) добавлять случайные GET-параметры к URL
Если же к файлу идет обращение через POST, то он в принципе не должен кешироваться, даже если все время одинаковые параметры посылать
а посылать случайный POST-параметр на сервер - смысла мало, если сервер конечно не собирается обработать пришедшее значение. Но, тогда тут может крытся серьезный просчет в архитектуре приложения

Последний раз редактировалось Gvozd, 01.01.2012 в 22:36.
Ответить с цитированием
  #4 (permalink)  
Старый 01.01.2012, 22:33
Новичок на форуме
Отправить личное сообщение для psarum Посмотреть профиль Найти все сообщения от psarum
 
Регистрация: 01.01.2012
Сообщений: 6

Ураа!!!
как всё просто
Спасибо!
Работает!

Атрибут сессии тоже ведь перепишется?
Ответить с цитированием
  #5 (permalink)  
Старый 01.01.2012, 22:37
Новичок на форуме
Отправить личное сообщение для psarum Посмотреть профиль Найти все сообщения от psarum
 
Регистрация: 01.01.2012
Сообщений: 6

Сообщение от Gvozd Посмотреть сообщение
Немного замечаний по остальному коду

Зачем вы добавляете случайный POST-запрос при запросе картинки с капчей?
Может быть в этом есть какой-то сакральный смысл, и так и вправду нужно сделать в вашем проекте, но скорее всего, вы просто прочитали статью про кеширование браузером, и не до конца ее поняли.
Для того, чтобы браузер не кешировал файлы надо(вернее это один из способов) добавлять случайные GET-параметры к URL
Если же к файлу идет обращение через POST, то он в принципе не должен кешироваться, даже если все время одинаковые параметры посылать
кусок кода из интернета, защита от кеширования там была и я её оставил, благо кушать не просит )
Ответить с цитированием
  #6 (permalink)  
Старый 01.01.2012, 22:55
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от psarum
кусок кода из интернета, защита от кеширования там была и я её оставил, благо кушать не просит )
Откуда вы знаете, что он кушать не просит, если вы даже не знаете что и почему он делает, и как работает?
Может вы своими руками установили серьезную дыру в безопасности своего сайта?
В общем, не стоит тащить всякий хлам со всего интернета, по принципу "лишь бы было, вроде работает"
Сообщение от psarum
Атрибут сессии тоже ведь перепишется?
ну, он у вас переписывается на сервере, при отдаче картинки
Так что если запрос будет послан на сервер, то перепишется
Ответить с цитированием
  #7 (permalink)  
Старый 01.01.2012, 23:12
Новичок на форуме
Отправить личное сообщение для psarum Посмотреть профиль Найти все сообщения от psarum
 
Регистрация: 01.01.2012
Сообщений: 6

Сообщение от Gvozd Посмотреть сообщение
В общем, не стоит тащить всякий хлам со всего интернета, по принципу "лишь бы было, вроде работает"

Данный "хлам" находиться на обкатке, постоянной перепроверке, и тестовом стенде. Как оно всё работает я имею представление. Но из за отсутствия большого опыта работы с сервлетами и взаимодействием по Ajax приходиться постоянно искать примеры реализации похожих алгоритмов интернете, применять их и разбираться каким образом оно работает.
Ответить с цитированием
  #8 (permalink)  
Старый 01.01.2012, 23:14
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от psarum
применять их и разбираться каким образом оно работает.
ну, тогда все нормально. так и надо делать
Ответить с цитированием
  #9 (permalink)  
Старый 04.01.2012, 09:51
Новичок на форуме
Отправить личное сообщение для psarum Посмотреть профиль Найти все сообщения от psarum
 
Регистрация: 01.01.2012
Сообщений: 6

Интересное наблюдение.
Запустил проект на рабочем компьютере.
И без id= + Math.random() картинка не обновляется
Корпоративная прокся не должна была вроде лезть в обмен данными...
Конфигурации серверов одни и те же ...
в общем случайный ай-ди оказался необходим
Ответить с цитированием
  #10 (permalink)  
Старый 04.01.2012, 10:35
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от psarum
в общем случайный ай-ди оказался необходим
во-первых, его необязательно так называть(скорее даже нежелательно), ведь это никак не ID
во-вторых, как я уже упомянул, случайный GET-параметр помогает от кеширования. Вы же в изначальном варианте использовали случайный POST-запрос, что не имеет никакого смысла
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как скрыть картинку, при этом оставив рамку KamalovRadik Firefox/Mozilla 7 07.05.2012 12:58
Вывод текста при клике на картинку KTIM Общие вопросы Javascript 7 05.12.2011 05:11
Нужен скрипт, подсвечивающий ссылку при наведение на картинку Vatrushka Общие вопросы Javascript 2 26.04.2011 09:02
Как поменять картинку при нажатии на нее syegorius Events/DOM/Window 1 28.08.2010 23:14
Обновление картинки при нажатии sdff Общие вопросы Javascript 2 07.10.2008 09:05