Джава. Сервер не отправляет правильный HTML - PullRequest
0 голосов
/ 09 сентября 2018

Я написал небольшое приложение на Java, но оно не обслуживает HTML должным образом. Проблема возникает, когда метод checkCookies возвращает false. Обычно должно быть выполнено предложение «else», но этого не происходит. Интересная вещь: приложение проходит 3 раза от запуска метода handle () до первого условия (счетчик увеличивается). Я не знаю, как его починить. Если я получил cookie с именем «Логин» или я вручную изменил метод, чтобы всегда возвращать 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;
}
}

UPDATE Я нашел причину своей проблемы. Если я посылаю пустой List методу checkCookies () , программа "зависает". Добавление условия

 if (cookies == null) return false; 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...