Джава. Сервер не отправляет правильный HTML

Я написал небольшое приложение на Java, но оно не обслуживает HTML должным образом. Проблема возникает, когда метод checkCookies возвращает false. Обычно должно выполняться предложение «else», но этого не происходит. Интересная вещь - приложение 3 раза переходит от начала метода handle () к первому условию (счетчик увеличивается). Я не знаю, как его отремонтировать. Если у меня есть файл cookie с именем «Login» или я вручную изменяю метод, чтобы всегда возвращать true, он работает нормально. Главный файл: Loginpage.java

import com.sun.net.httpserver.HttpServer;

import java.net.InetSocketAddress;

public class Loginpage {
    public static void main (String[] args) throws Exception{
        HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
        server.createContext("/form", new Form());
        server.setExecutor(null);
        server.start();
    }
}

Form.java

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;

import java.io.*;
import java.net.HttpCookie;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Form implements HttpHandler {
int counter = 0;

@Override
public void handle(HttpExchange httpExchange) throws IOException {
    counter++;
    System.out.println(counter);
    List<String> cookies = httpExchange.getRequestHeaders().get("Cookie");
    HttpCookie cookie;
    String response = "<html><body>system</body></html>";
    String method = httpExchange.getRequestMethod();
    if (checkCookies(cookies)) {
        response = "<html><body> Hello! </body></html>";
    } else {
        if (method.equals("GET")) {
            response = "<html><body><form method='post'>" +
                    "<input type='text' name='username'><br>" +
                    "<input type='password' name='pass'><br>" +
                    "<input type='submit' value='login'<br>" +
                    "</form></body></html>";
        } else if (method.equals("POST")) {
            InputStreamReader isr = new InputStreamReader(httpExchange.getRequestBody(), "utf-8");
            BufferedReader br = new BufferedReader(isr);
            String formData = br.readLine();
            Map data = parseFormData(formData);
            if (checkData(data)) {
                cookie = new HttpCookie("Login", String.valueOf(counter + (counter * 12)));
                httpExchange.getResponseHeaders().add("Set-Cookie", cookie.toString());
            }
        }
    }

    httpExchange.sendResponseHeaders(200, response.length());
    OutputStream os = httpExchange.getResponseBody();
    os.write(response.getBytes());
    os.close();
}

private boolean checkCookies(List<String> cookies) {
    boolean isValid = false;
    for (String s : cookies) {
        System.out.println(s);
        if (s.matches("Login.*")) {
            isValid = true;
        }
    }
    System.out.println(isValid);
    return isValid;
}

private boolean checkData(Map<String, String> data) {
    DAO dao = new DAO();
    String username = data.get("username");
    System.out.println(username);

    String password = data.get("pass");
    System.out.println(password);
    if (dao.checkData(username, password)) {
        return true;
    } else return false;

}

private static Map<String, String> parseFormData(String formData) throws UnsupportedEncodingException {
    Map<String, String> map = new HashMap<>();
    String[] pairs = formData.split("&");
    for (String pair : pairs) {
        String[] keyValue = pair.split(" = ");
        String value = new URLDecoder().decode(keyValue[1], "UTF-8");
        map.put(keyValue[0], value);
    }
    return map;
}
}

ОБНОВИТЬ Я нашел причину своей проблемы. Если я посылаю методу checkCookies () пустой Список, программа "зависает". Добавление условия

 if (cookies == null) return false; 

в методе checkCookies () проблема была решена, но я не знаю, почему не удалось просто вернуть false перед исправлением. Кто-нибудь может это объяснить?

Это был не пустой список - это ссылка на null. Следовательно, у вас есть NullPointerException, и ваш код прерван. Найдите исключение в консоли или в файлах журнала.

Erwin Bolwidt 09.09.2018 03:01

@ErwinBolwidt в консоли у меня нет исключения. Просто счетчик увеличивается в 3 раза и все. Я тоже проверяю журнал и ничего - снова. Программа все еще работает, но не переходите к «следующему шагу».

J W 09.09.2018 03:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
79
0

Другие вопросы по теме