JavaScript: клиентский по сравнению с проверкой серверной стороны

То, что вам не хватает, - это cellValueFactory для ваших столбцов, которые будут сообщать столбцу, какое значение будет отображаться в его ячейках.

Что-то вроде этого:

TableView> tableView = new TableView<>();
List columnNames = dataGenerator.getNext(N_COLS);
for (int i = 0; i < columnNames.size(); i++) {
    final int finalIdx = i;
    TableColumn, String> column = new TableColumn<>(
            columnNames.get(i)
    );
    column.setCellValueFactory(param ->
            new ReadOnlyObjectWrapper<>(param.getValue().get(finalIdx))
    );
    tableView.getColumns().add(column);
}

Пример приложения

Это решение было немного основано на сообщении блога Narayan: Обновлено: Динамические данные TableView из базы данных . Вместо этого сообщения в блоге это решение использует генератор тестовых данных для генерации некоторых фиктивных данных и некоторых функций лямбда Java 8, которые делают заводское определение значения ячейки немного менее громоздким для записи и просмотра.

import javafx.application.Application;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.stage.Stage;

import java.util.*;

public class DynamicTableView extends Application {    
    private static final int N_COLS = 5;
    private static final int N_ROWS = 1_000;

    public void start(Stage stage) throws Exception {
        TestDataGenerator dataGenerator = new TestDataGenerator();

        TableView> tableView = new TableView<>();

        // add columns
        List columnNames = dataGenerator.getNext(N_COLS);
        for (int i = 0; i < columnNames.size(); i++) {
            final int finalIdx = i;
            TableColumn, String> column = new TableColumn<>(
                    columnNames.get(i)
            );
            column.setCellValueFactory(param ->
                    new ReadOnlyObjectWrapper<>(param.getValue().get(finalIdx))
            );
            tableView.getColumns().add(column);
        }

        // add data
        for (int i = 0; i < N_ROWS; i++) {
            tableView.getItems().add(
                    FXCollections.observableArrayList(
                            dataGenerator.getNext(N_COLS)
                    )
            );
        }

        tableView.setPrefHeight(200);

        Scene scene = new Scene(tableView);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

    private static class TestDataGenerator {
        private static final String[] LOREM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tempus cursus diam ac blandit. Ut ultrices lacus et mattis laoreet. Morbi vehicula tincidunt eros lobortis varius. Nam quis tortor commodo, vehicula ante vitae, sagittis enim. Vivamus mollis placerat leo non pellentesque. Nam blandit, odio quis facilisis posuere, mauris elit tincidunt ante, ut eleifend augue neque dictum diam. Curabitur sed lacus eget dolor laoreet cursus ut cursus elit. Phasellus quis interdum lorem, eget efficitur enim. Curabitur commodo, est ut scelerisque aliquet, urna velit tincidunt massa, tristique varius mi neque et velit. In condimentum quis nisi et ultricies. Nunc posuere felis a velit dictum suscipit ac non nisl. Pellentesque eleifend, purus vel consequat facilisis, sapien lacus rutrum eros, quis finibus lacus magna eget est. Nullam eros nisl, sodales et luctus at, lobortis at sem.".split(" ");

        private int curWord = 0;

        List getNext(int nWords) {
            List words = new ArrayList<>();

            for (int i = 0; i < nWords; i++) {
                if (curWord == Integer.MAX_VALUE) {
                    curWord = 0;
                }

                words.add(LOREM[curWord % LOREM.length]);
                curWord++;
            }

            return words;
        }
    }
}

170
задан Yi Jiang 15 March 2011 в 06:01
поделиться

6 ответов

Как другие сказали, необходимо сделать обоих. Вот то, почему:

Сторона клиента

Вы хотите проверить вход на стороне клиента сначала, потому что можно дать лучшая обратная связь среднему пользователю . Например, если они вводят недопустимый адрес электронной почты и перемещаются в следующее поле, можно сразу показать сообщение об ошибке. Тем путем пользователь может исправить каждое поле прежде , они отправляют форму.

, Если Вы только проверяете на сервере, они должны отправить форму, получить сообщение об ошибке и попытаться выследить проблему.

(Эта боль может быть упрощена при наличии сервера, повторно представляют форму с исходным заполненным входом пользователя, но клиентская проверка еще быстрее.)

Сторона сервера

Вы хотите проверить на стороне сервера, потому что Вы можете защищать от злонамеренного пользователя , кто может легко обойти Ваш JavaScript и отправить опасный вход серверу.

очень опасно доверять Вашему UI. Не только может они злоупотреблять Вашим UI, но и они не могут использовать Ваш UI вообще, или даже браузер . Что, если пользователь вручную редактирует URL, или запускает их собственный JavaScript или настраивает их Запросы HTTP с другим инструментом? Что, если они отправляют пользовательские Запросы HTTP от curl или из сценария, например?

( Это не теоретически; например, я работал над поисковой системой перемещения, которая повторно отправила поиск пользователя многим авиакомпаниям, компаниям шины, и т.д., путем отправки POST, запросы, как будто пользователь заполнил поисковую форму каждой компании, затем собрали и отсортировали все результаты. Форма тех компаний JS никогда не выполнялся, и для нас было крайне важно, чтобы они предоставили сообщения об ошибках в возвращенном HTML. Конечно, API был бы хорош, но это было тем, что мы должны были сделать. )

Не обеспечение этого не только наивно с точки зрения безопасности, но также и нестандартно: клиенту нужно разрешить отправить HTTP любыми средствами, которых они желают, и необходимо ответить правильно. Это включает проверку.

Серверная проверка также важна для [1 122] совместимость - не все пользователи, даже если они будут использовать браузер, то включат JavaScript.

Приложение - декабрь 2016

существует некоторые проверки, которые не могут даже быть правильно сделаны в коде приложения серверной стороны и совершенно невозможны в клиентском коде , потому что они зависят от текущего состояния базы данных. Например, "никто больше не зарегистрировал то имя пользователя", или "сообщение в блоге, которое Вы комментируете, все еще существует", или "никакое существующее резервирование не перекрывает даты, которые Вы запросили", или "Ваш остаток на счете все еще имеет достаточно для покрытия той покупки". Только база данных может надежно проверить данные, которые зависят от связанных данных. Разработчики регулярно винт это , но PostgreSQL предоставляет некоторые хорошие решения .

329
ответ дан Nathan Long 23 November 2019 в 20:45
поделиться

Да, клиентская проверка может быть полностью обойдена, всегда. Необходимо сделать обоих, сторона клиента для обеспечения лучшего пользовательского опыта и стороны сервера, чтобы быть уверенными, что вход, который Вы получаете, на самом деле проверен и не только, предположительно, проверен клиентом.

77
ответ дан Vinko Vrsalovic 23 November 2019 в 20:45
поделиться

Я просто собираюсь повторить его, потому что это довольно важно:

Всегда проверяют на сервере

и добавляют JavaScript для пользовательской скорости отклика.

41
ответ дан Toby Hede 23 November 2019 в 20:45
поделиться

Преимущество выполнения серверной проверки по клиентской проверке - то, что клиентская проверка может обходиться/управляться:

  • конечному пользователю можно было выключить JavaScript
  • , данные могли быть отправлены непосредственно на Ваш сервер кем-то, кто даже не использует Ваш сайт с пользовательским приложением, разработанным, чтобы сделать так
  • , ошибка JavaScript А на Вашей странице (вызванный любым количеством вещей) могла привести к некоторым, но не всем, Вашей проверки, работающей

Короче говоря - всегда, всегда проверять серверную сторону и затем полагать, что клиентская проверка как добавленное "дополнительное" улучшила опыт конечного пользователя.

31
ответ дан Rob 23 November 2019 в 20:45
поделиться

Вы всегда должны проверять на сервере.

Также имеющая проверка на клиенте хороша для пользователей, но совершенно небезопасна.

18
ответ дан Peter Boughton 23 November 2019 в 20:45
поделиться

Если Вы делаете легкую проверку, лучше делать это на клиенте. Это сохранит сетевой трафик, который поможет Вашему серверу работать лучше. Если, если это усложнило проверку, которая включает получение по запросу данных из базы данных или чего-то, как пароли, то это лучше всего, чтобы сделать это на сервере, где данные могут быть надежно проверены.

-2
ответ дан Tom 23 November 2019 в 20:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: