Профиль пользователя заблокирован сроком с 24 марта 2024 г. и навсегда по причине: систематические нарушения пункта 5.2 правил сервиса
  • Как отправить http post запрос в теле которого будет sql запрос?

    @My1Name
    Как мне сделать так что бы соответствующий http post запрос доставлял на эту страницу sql запрос, далее который обрабатывался и выдавал ответ в качестве выгрузки html с бд.

    Что значит "на эту страницу sql запрос"? Вы хотите вывести тело метода запроса? То есть код (команду), по которой осуществляется та или иная операция с БД?

    Если я всё правильно понял, то ответ - никак. Вы можете только строить догадки, если у вас нет доступа к самой БД

    JDBC я не могу использовать, так как прямого где login и password у меня нет.

    То есть, вы даже не знаете как выглядит таблица. Какие там поля, есть ли индексы и т.д. и т.п. А значит вам нужно создать свой набор команд (свою интерпретацию), который будет доступен для работы с БД через ваш Apache HttpClient.
    Ответ написан
  • Как отправить два разных event в одном SseEmitter?

    @My1Name Автор вопроса
    Ответ банально прост (хотя я искал его 2 дня, и прямого ответа нигде не нашёл): Нужно создать два event в теле метода.
    SseEventBuilder event1 = SseEmitter....
    emitter.send(event1);
    SseEventBuilder event2 = SseEmitter....
    emitter.send(event2);

    На сайте Baeldung и др. ресурсах, есть только косвенный намёк на такое решение через ExecutorService... Нужно было заглянуть в javadoc SseEmitter - static interface extends ResponseBodyEmitter и можно было догадаться. https://www.baeldung.com/spring-server-sent-events
    Ответ написан
    Комментировать
  • Насколько Spring Security хорошо защищает твой бакэнд?

    @My1Name
    насколько хорошо spring security защищает

    В RESTful приложениях, по идее никаких проблем с безопасностью быть не может. Потому что любой запрос связан с сущностью, которая просто не будет построена если какая-то часть запроса не соответствует типу данных хотя бы одному из полей объекта (включая фильтры Security). См. Entity-Control-Boundary (Robustness diagram).

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

    Spring-security - обеспечивает безопасный канал обмена данными. В каждом запросе клиент/сервер передаётся "пакетный набор" для идентификации пользователя. Например: IP адрес, hash-code сессии, крипто-пароль и др. Это обеспечивает безопасный канал связи. А обработка запросов (в том числе неправильных) - это задача разработчика.
    Ответ написан
  • Как составить оптимизированный SQL-запрос для поиска по нескольким таблицам?

    @My1Name
    Приведённый в пример запрос, очень похож на структуру хранения данных Lucene Core


    Такой запрос оптимален или есть варианты получше?

    Полнотекстовый поиск с ElasticSearch, наверно будет более оптимальным решением.
    Ответ написан
    Комментировать
  • В каком виде хранить данные для графиков?

    @My1Name
    Если это сбор данных в течение года, то такую информацию нужно хранить в файле/ах, делая (каждый час/день/неделю/месяц) дозапись. Для удобства, можно присваивать соответствующие имена в виде дат (и времени). Например: 01-01-2023.txt 01-02-2023.txt и т.д. А при построении графиков, просто парсить эти файлы.

    Суть вопроса, узнать на сколько это практично

    Если я правильно понял суть вопроса, то обычно такую информацию пишут и хранят в Excel.
    Ответ написан
    Комментировать
  • Как обратиться в методе контролера к объекту запроса?

    @My1Name
    Как мне теперь обратиться к этому объекту в параметре метода контролера?

    Я не знаю что это за @InitBinder но я также не увидел, чтоб вы где-то создали объект "Product". Если WebDataBinder считается объектом, то вы его преобразовали в строку String str = binder.getTarget().toString()+ Далее вы создали MutablePropertyValues, что эквивалентно Map <String, String> или <String, Object> Короче говоря: вы нигде не создали объект Product чтоб к нему обращаться.
    Ответ написан
    Комментировать
  • Как защитить Spring приложение, отключив CSRF-токен?

    @My1Name Автор вопроса
    Учитывая тот факт, что у меня не банковское приложение и финансовых рисков особо никаких нет, я не вижу причин запрещать пользователям встраивать личные страницы (или др. страницы сайта) в iframe. Главная задача в таком случае: ͟з͟а͟п͟р͟е͟т͟и͟т͟ь͟ ͟а͟в͟т͟о͟р͟и͟з͟и͟р͟о͟в͟а͟н͟н͟ы͟е͟ ͟з͟а͟п͟р͟о͟с͟ы͟. Для этого я разместил в шапку (в header на всех страницах сайта) незамысловатый скрипт:
    const currentUrl = document.referrer;
    $.get('ajax/index', {ref:currentUrl});

    document.referrer - возвращает URL родительской страницы (которая загрузила iframe). Это работает, даже если родительский документ и iframe находятся на разных доменах. Как только начинается загрузка страницы, currentUrl отправляется в контроллер:
    private @ResponseBody void checkReferrer(Principal principal, 
    			HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		String currentUrl = req.getParameter("ref");
    		currentUrl = currentUrl.substring(currentUrl.indexOf("/")+2);
    		String localName = req.getServerName();
    		if (principal!=null && !currentUrl.startsWith(localName)) {
    			req.getSession().invalidate(); 
    			req.logout();
    			Cookie [] cookies = req.getCookies();
    			if(cookies!=null) {
    				for(Cookie c : cookies) {
    					c.setValue("");
    					c.setPath("/");
    					c.setMaxAge(0);
    					resp.addCookie(c);
    				}
    			}
    		}
    	}

    Контроллер проверяет переданный URL и сравнивает его с именем сервера. Далее, если переданный адрес не включает в себя имя сервера и это ͟а͟в͟т͟о͟р͟и͟з͟и͟р͟о͟в͟а͟н͟н͟ы͟й͟ ͟з͟а͟п͟р͟о͟с͟, то происходит выход с системы и удаление всех куки. В настройках Spring-Security:
    http.csrf()
    .disable().and()
    ....
    frameOptions().sameOrigin();

    Политика Same-Origin предотвращает доступ внешним скриптам к странице встроенной в iframe. А при отключении скриптов, любые запросы будут происходить от имени пользователя. То есть, програмно можно получить доступ только к своему аккаунту и только через главный вход (через iframe вход не получится). А если я что-то не учёл - критика в комментариях приветствуется.
    Ответ написан
  • Как сделать INSERT в две таблицы в одном запросе?

    @My1Name Автор вопроса
    Как сделать INSERT в две таблицы в одном запросе?

    Использовать batchUpdate. Например так:
    jdbcTemplate.batchUpdate(new String [] {
    "DELETE FROM statusChat WHERE id IN("+id1+", "+id2+") LIMIT 2",
    "DELETE FROM invites WHERE id="+id1+" AND idInviter="+id2
    });

    Для более сложных запросов с неизвестным количеством параметров, можно использовать BatchPreparedStatementSetter. Например:
    ArrayList <Long> listID;
    		String SQL = "DELETE FROM statusChat WHERE id IN(?";
    		for(int i=0; i<(listID.size()-1; i++)
    			SQL = SQL+",?"; SQL=SQL+")";
    		jdbcTemplate.batchUpdate(SQL, new BatchPreparedStatementSetter() {
    			@Override
    			public void setValues(PreparedStatement ps, int i) throws SQLException {
    				i=1;
    				for (int x=0; x<listID.size(); x++, i++) {
    					long id = listID.get(x);
    					ps.setLong(i, id));
    				}
    			}
    Ответ написан
    Комментировать
  • Как вернуть страницу с id в Spring?

    @My1Name
    Как вернуть страницу с id в Spring?

    В первую очередь нужно понять, что страница с id - это ссылка с параметрами. Ссылка - указывает на страницу, а параметры - на объект.

    В пост-методе контроллера "/routes/edit-all-sequence/{id}/" выделяет, как не соответствующую страницу MVC.

    Страница у вас одна. Меняются только значения связанные с объектом.

    Если вы используете redirect, то вместо Model используйте RedirectAttributes или ModelAndView. Тогда ваш код будет выглядеть следующим образом:model.addFlashAttribute("sequenceGapError", true); и будет автоматически распространяться на «выходной» FlashMap текущего запроса.

    Прежде чем делать перенаправление, попробуйте вернуть стандартную страницу:
    return "/routes/edit-all-sequence/"; По идее должна вернуться страница с параметрами {id} текущего запроса и, никакой redirect вам не нужен.
    Ответ написан
    Комментировать
  • Как написать свой матричный фильтр (например размытие по Гауссу)?

    @My1Name
    Меня смущают форматы значений причем все - RGB, HEX, CMYK.

    Что именно? У всех цветных изображений, исходные значения RGB (от 0 до 255). Это три цвета: R - красный, G - зелёный и B- синий. Их смешивание даёт разные оттенки и значение пикселя. На этой основе строятся другие цветовые карты, такие как CMYK, где чёрный и белый - ноль и 255 для всех трёх цветов соответственно.

    вопрос в том, как произвести расчет со значениями пикселей в матрице?

    Берёте матрицу n×n (в данном случае показана матрица 3×3) и усредняете значение смежных пикселей.

    Для простоты понимания, можно взять пример преобразования цветного изображения в черно-белое; выводится сумма трёх цветов (RGB × коэффициент) в одном пикселе:
    result = 0.2126*r + 0.7152*g + 0.0722*b
    Ответ написан
  • Как вернуть ссылку с параметрами?

    @My1Name Автор вопроса
    Может кому-то поможет:
    @GetMapping("users/**")
    public String show(@RequestParam(value="id", required=false) String id){
    if (id==null)
    return "/";
    ........
    return "users";
    }

    Я искал решение, чтоб отображать "красивую ссылку", типа users/1234 или такую, которую пользователь мог бы выбрать сам (вместо 1234).

    Чтоб сформировать "красивую ссылку", url нужно получать с HttpServletRequest, и в таком случае параметры @RequestParam не нужны.
    @GetMapping("/publisher/**")
    	public String publisher(HttpServletRequest req, Principal principal, Model model){
    		String id = req.getRequestURL().toString();
    		id = id.substring(id.indexOf("/publisher")+10); // "/publisher" == 10
    		if (id.startsWith("/"))
    			id=id.substring(1);
    		if (principal==null && id.isBlank()) {
    			return "redirect:/";
    		}
    		else {
    			id = urlModelByOwner(principal, model, id);
    		}
    		if(!id.isBlank())
    		return "redirect:publisher"+id;
    	return "publisher";
    	}
    Ответ написан
  • Как средствами Thymeleaf вывести html переменную в JavaScript?

    @My1Name Автор вопроса
    <script th:inline="javascript">
    var htmlVariable = /*[#th:block th:utext="${htmlText}"/]*/;
    </script>
    Html текст нужно предварительно взять в 'одинарные' кавычки. Иначе JavaScript не будет работать.

    Более простой вариант:
    var htmlVariable = /*[[${htmlText}]]*/ 'value'; при этом 'value' будет заменено ${htmlText} содержанием. Однако, могут быть проблемы с UTF-8.

    Самый простой вариант:
    <script th:inline="javascript">
    var htmlVariable = '[(${htmlText})]';
    </script>
    Ответ написан
    Комментировать
  • Как сбросить кэш Apache Tomcat 9?

    @My1Name
    Сброс кэша в браузере

    Нужно прописать cache-control в вашем приложении, и Tomcat тут ни причём... Если вы используете браузер, то как минимум работаете с Servlet-ом. А значит можете прописать в классе extends HttpServlet что-то подобное:
    response.setHeader("Cache-Control", "no-cache, no-store");
    response.setHeader("Pragma", "no-cache");
    response.setHeader("Expires", "0");

    Но и это не самое лучшее решение... Сегодня все используют Framework Spring. И тогда нужно добавить одну строчку в классе implements WebMvcConfigurer
    registry.setCachePeriod(0);
    В Spring Security:
    http.
    ....
    and()
    .deleteCookies("JSESSIONID")
    .http.build();
    Ответ написан
    Комментировать
  • Есть ли в java оператор аналогичный ?: в php?

    @My1Name
    Именно в java оператора "?" - нет. Есть в шаблонизаторе Thymeleaf для работы с (html) фреймворком Spring. Называют оператор Элвиса
    <td th:text="${teacher.additionalSkills} ?: 'UNKNOWN'" />

    В Java знак вопроса иногда ставится в качестве параметра для коллекций (массивов) с заранее неизвестным типом данных. Например: List <?> В Spring этот условный оператор мало чем отличается от if/else, и лично я ни разу его не использовал.
    Ответ написан
  • В чем причина ошибки в время компиляции?

    @My1Name
    Подскажите в чем может быть причина ошибки компиляции?

    Попробуйте включить базу данных...

    src\main\java\ru\geraskindenis\repository\impl\PersonalAccountRepositoryImpl.java:32: error: cannot find symbol
    preparedStatement.setLong(1, personalAccount.getOwnerId());

    Эта ошибка говорит о том, что у вас проблемы со связью (сущности) @Entity и БД preparedStatement Судя по "cannot find symbol" - ошибка ^ в SQL запросе (но это не точно).

    p.s. На всякий случай, можно ещё переустановить ОС xd
    Ответ написан
    Комментировать
  • Как установить в ответ http-код 412 и одновременно отменить выполнение запросов типа POST, PUT, DELETE?

    @My1Name
    Как установить в ответ http-код 412 и одновременно отменить выполнение запросов типа POST, PUT, DELETE?

    Написать класс - контролер для соответствующей страницы с двумя методами: Один с аннотацией @GetMapping Второй с аннотацией @RequestMapping("/") или @PostMapping для выше упомянутых случаев, и добавить в его параметры HttpServletResponse resp В теле метода:
    resp.setStatus(412); return "redirect:error_page.html";
    Можно сделать метод void или делать переадресацию.

    REST - это GET и POST запросы (обычный HTTP), а необходимые данные передаются в качестве параметров запроса. Так что PUT, DELETE и всё остальное, можно отнести к @PostMapping
    Ответ написан
    Комментировать
  • Почему не работает Thymeleaf аутентификация в Spring Security?

    @My1Name Автор вопроса
    Делаем по инструкции Thymeleaf и добавляем:
    templateEngine.addDialect(new SpringSecurityDialect());
    Класс конфигурации:
    @Configuration
    public class WebSecurityConfig implements WebMvcConfigurer {
    ........
    @Bean
    	public SpringResourceTemplateResolver templateResolver(){
    	    SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
    	    templateResolver.setApplicationContext(servletContext);
    	    templateResolver.setPrefix("/");
    	    templateResolver.setSuffix(".html");
    	    templateResolver.setTemplateMode(TemplateMode.HTML);
    	    templateResolver.setCacheable(false);
    	    return templateResolver;
    	}
    	@Bean
    	public SpringTemplateEngine templateEngine(){
    	    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    	    templateEngine.setTemplateResolver(templateResolver());
    	    templateEngine.setEnableSpringELCompiler(true);
    	    templateEngine.addDialect(new SpringSecurityDialect());
    	    return templateEngine;
    	}
    	@Bean
        public ThymeleafViewResolver viewResolver(){
            ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
            viewResolver.setTemplateEngine(templateEngine());
            return viewResolver;
        }
    }

    В pom.xml всё что связано с Thymeleaf и аутентификацией:
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
    	<groupId>org.thymeleaf</groupId>
    	<artifactId>thymeleaf-spring5</artifactId>
    </dependency>
    <dependency>
    	<groupId>org.thymeleaf.extras</groupId>
    	<artifactId>thymeleaf-extras-springsecurity5</artifactId>
    </dependency>

    На странице index.html:
    <!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-4.dtd">
    <html xmlns:th="http://www.thymeleaf.org" 
    xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
    Ответ написан
    Комментировать
  • Как взаимодействуют компоненты в проекте Java + Spring?

    @My1Name
    Думаю ответ на все эти вопросы - Multithreading, где фреймворк Spring является главным потоком, который собирает все наши интерфейсы и выполняет методы классов в своём стриме. Разработчик не может влазить в Runtime фреймворка, и тот в свою очередь не видит наши классы. То есть, классов может быть много, но все они наследуют логику сервлета через интерфейс фреймворка. В этом по идее заключается вся суть IoC (Inversion of Control and Dependency Injection).

    p.s. Если я ошибаюсь, пусть меня поправят профессионалы.
    Ответ написан
    Комментировать
  • Как правильно создать БД в одном execute?

    @My1Name Автор вопроса
    Скачиваем JDBC драйвер и добавляем в проект через Build Puth. Тренируемся создавать запросы и проверяем:
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.Statement;
    
    public class Main {
    	public static void main(String[] args) {
    		String command = "C:\\ путь к файлу .exe для запуска MySQL сервера с приложения \\MySQL Server 8.0\\bin\\mysqld.exe";
    		try{
    	   Runtime.getRuntime().exec(command); //run MySql
                String url = "jdbc:mysql://localhost/";
                String username = "root";
                String password = "byDefault";
                Class.forName("com.mysql.cj.jdbc.Driver").getDeclaredConstructor().newInstance();
                try (Connection conn = DriverManager.getConnection(url, username, password)){
                	 Statement statement = conn.createStatement();
                	 statement.execute("CREATE DATABASE IF NOT EXISTS usersdb");
                	 statement.execute("USE usersdb");
                	 statement.execute("CREATE TABLE IF NOT EXISTS users"+
                	    		"(id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,"+
                	    		"email VARCHAR(256) NOT NULL,"+
                	    		"password VARCHAR(128),"+
                	    		"UNIQUE KEY(email));");
                		}
            }
    		catch(Exception e){
                e.printStackTrace();
            }
    }

    Всё работает. Зашивать JDBC коннектор в проект, запускать или создавать базу данных с приложения, решать только разработчику. https://www.mysqltutorial.org/mysql-unique/
    Ответ написан
  • Почему поиск FuzzyQuery (Apache Lucene) ничего не возвращает?

    @My1Name Автор вопроса
    FuzzyQuery ищет слово + offset символов в слове (по параметру maxEdits). Он не ищет словосочетания. Нужно унифицировать набор методов Query. FuzzyQuery - это один из множества фильтров (модификаторов) запроса. Фильтры нужно комбинировать для получения желаемого результата. Вот некоторые из них: TermQuery, PhraseQuery, BooleanQuery, WildcardQuery, PrefixQuery...

    Основной принцип работы Apache Lucene основан на подсчитывании очков (Scoring). Так создаётся релевантный список результатов поиска по индексам.
    Ответ написан