Я написал небольшое приложение на 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 перед исправлением. Кто-нибудь может это объяснить?
@ErwinBolwidt в консоли у меня нет исключения. Просто счетчик увеличивается в 3 раза и все. Я тоже проверяю журнал и ничего - снова. Программа все еще работает, но не переходите к «следующему шагу».




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