Swipe right or swipe left
Что делать, если твои мэтчи в жизни не такие точные, как твой код?
Спокойно, 14 февраля в 19:00 по МСК мы разберём, как ML анализирует speed dating и предсказывает match.
📌 Мы возьмем реальные данные со speed dating.
📌 Обучим модель, которая скажет: match или swipe left.
📌 Разберём, какие признаки реально важны (спойлер: работа в IT — не прям гарантия успеха (наши маркетологи подтверждают 😥).
💡 Приходи, если хочешь прокачать свой Python, ML и, возможно, станешь идеальной парой, как самый стильные форсы.
👉 Записаться
Что делать, если твои мэтчи в жизни не такие точные, как твой код?
Спокойно, 14 февраля в 19:00 по МСК мы разберём, как ML анализирует speed dating и предсказывает match.
📌 Мы возьмем реальные данные со speed dating.
📌 Обучим модель, которая скажет: match или swipe left.
📌 Разберём, какие признаки реально важны (спойлер: работа в IT — не прям гарантия успеха (наши маркетологи подтверждают 😥).
💡 Приходи, если хочешь прокачать свой Python, ML и, возможно, станешь идеальной парой, как самый стильные форсы.
👉 Записаться
Методы HTTP, такие как POST, PUT, и DELETE, не являются неизменяемыми, поскольку они изменяют состояние сервера, добавляя, обновляя или удаляя данные. В отличие от них, методы GET и HEAD считаются неизменяемыми, так как они только запрашивают данные, не влияя на сервер.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🤯2🤔1
Симметричность – это свойство, при котором если A связано с B, то B связано с A.
В логике и алгебре отношение \( R \) называется симметричным, если:
a R b \Rightarrow b R a
Но, например, отношение "a > b" не симметрично, потому что если a > b, то b > a – это неверно.
В Java симметричность важна при переопределении метода
equals(). Если
a.equals(b) == true, то обязательно должно быть b.equals(a) == true. Ошибочный код (нарушает симметричность) class Person {
String name;
Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof String) { // ❌ Сравниваем с String (ошибка)
return this.name.equals(obj);
}
return false;
}
}
public class Main {
public static void main(String[] args) {
Person p = new Person("Alice");
System.out.println(p.equals("Alice")); // true
System.out.println("Alice".equals(p)); // false ❌ (нарушена симметричность)
}
}Правильный способ
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return name.equals(person.name);
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
2. POST: отправка данных в теле запроса.
3. PUT: для обновления данных на сервере.
4. DELETE: для удаления данных.
5. PATCH: для частичного обновления.
6. HEAD: отправка заголовков без тела.
7. OPTIONS: получение информации о доступных методах.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥1
обрабатывает HTTP-запросы и отдает статический контент (HTML, CSS, JS, изображения).
запускает бизнес-логику приложения, выполняет обработку данных и работает с базой данных.
Принимает HTTP-запросы от браузера.
Отдает статические файлы (HTML, CSS, JS, картинки).
Может перенаправлять запросы к Application Server.
Apache HTTP Server
Nginx
Microsoft IIS
Допустим, пользователь открывает сайт
example.com/index.html: Браузер отправляет HTTP-запрос:
GET /index.html HTTP/1.1
Host: example.com
Веб-сервер (например, Nginx) получает запрос и отправляет браузеру файл
index.html. Web Server НЕ обрабатывает логику приложения, он просто отправляет файлы клиенту.
Обрабатывает динамические запросы (например, авторизацию, платежи, работу с БД).
Выполняет Java-код (Servlet, EJB, Spring, Hibernate).
Может генерировать HTML-страницы на сервере (JSP, Thymeleaf).
Управляет транзакциями и соединениями с базой данных.
Tomcat (самый популярный в мире Java-сервер)
WildFly (JBoss)
GlassFish
WebLogic, WebSphere
Допустим, пользователь заходит на
example.com/login: Браузер отправляет HTTP-запрос:
POST /login HTTP/1.1
Host: example.com
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤2🔥1
- Данные передаются в строке URL.
- Ограничение на длину данных (зависит от браузера/сервера).
- Менее безопасен, так как параметры видны в URL.
2. POST:
- Данные передаются в теле запроса.
- Подходит для отправки больших объемов данных.
- Более безопасен, так как данные не отображаются в URL.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🤔3🔥1
В Java тип
int занимает 4 байта (32 бита) и имеет диапазон: -2^{31} \text{ до } 2^{31} - 1
Integer.MIN_VALUE = -2,147,483,648 Integer.MAX_VALUE = 2,147,483,647 public class Main {
public static void main(String[] args) {
System.out.println("Минимальный int: " + Integer.MIN_VALUE);
System.out.println("Максимальный int: " + Integer.MAX_VALUE);
}
}Вывод:
Минимальный int: -2147483648
Максимальный int: 2147483647
4 байта (32 бита) означают, что у нас 2³² возможных значений.
Поскольку
int знаковый (поддерживает отрицательные и положительные числа), половина значений отводится подотрицательные числа. Один бит используется для знака (
0 – положительное число, 1 – отрицательное). \text{Диапазон} = - (2^{31}) \text{ до } (2^{31} - 1)
Если сложить два максимальных значения
int, произойдёт переполнение (overflow)int a = Integer.MAX_VALUE;
int b = 1;
int c = a + b;
System.out.println(c); // Выведет -2147483648 (переполнение!)
Использовать `long` (8 байт, диапазон от
-2^63 до 2^63 - 1): long bigNumber = 2_147_483_648L; // Обязательно добавлять "L" в конце
Использовать
BigInteger (неограниченный размер): BigInteger bigNum = new BigInteger("999999999999999999999999");Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🤔4
1. PrintWriter:
- Используется для записи текстового содержимого в HTTP-ответ.
- Подходит для работы с текстами, HTML, JSON.
2. ServletOutputStream:
- Используется для записи байтовых данных в HTTP-ответ.
- Подходит для работы с файлами, изображениями или потоками данных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥1
Forwarded from easyoffer
Привет, ребята!
1,5 года я учился на программиста, а сайт easyoffer.ru стал моим пет-проектом. Я создавал его, потому что:
а) нужно было добавить хоть какой-нибудь проект в резюме
б) подготовиться к прохождению собесов
И всё получилось! Благодаря еasyoffer я успешно прошёл собеседование и устроился Python Junior-разработчиком на удаленку с зарплатой 115 тысяч рублей.
Однако ещё во время разработки я понял, что у этого проекта есть потенциал. Казалось, что сайт может стать популярным и, возможно, превратиться в стартап.
По-этому я с самого начала заложил в проект минимальную бизнес-модель, на случай, если сайт начнёт набирать трафик. Я предложил пользователям полный доступ к сайту в обмен на подписку на Telegram-каналы. Это позволяло развивать аудиторию, а в будущем — зарабатывать на рекламе.
Результат превзошёл ожидания!
С момента запуска easyoffer посетило 400 тысяч человек. А когда доход с рекламы превысил мою зарплату программиста, я принял решение уйти с работы и полностью посвятить себя разработке новой версии сайта.
Вот так, зайдя в IT, через 4 месяца вышел через свой же пет-проект. Мне очень повезло
Уже год я работаю над easyoffer 2.0.
Это будет более масштабный и качественной новый проект:
– Появится тренажер
– Появятся задачи из собесов
– Фильтрация контента по грейдам
и еще очень много фич, о которых я расскажу позже.
Хочу, довести easyoffer до ума, чтобы сайт стал настоящим помощником для всех, кто готовится к собеседованиям.
По этому в ближайшее время я объявлю о старте краудфандинговой кампании, чтобы ускорить разработку и я готов щедро отблагодарить всех, кто поддержит проект.
А те, кто поддержат проект первыми, получат специальные лимитированные выгодные вознаграждения. Следите за этим телеграм каналом, если хотите стать первыми сапортерами.
1,5 года я учился на программиста, а сайт easyoffer.ru стал моим пет-проектом. Я создавал его, потому что:
а) нужно было добавить хоть какой-нибудь проект в резюме
б) подготовиться к прохождению собесов
И всё получилось! Благодаря еasyoffer я успешно прошёл собеседование и устроился Python Junior-разработчиком на удаленку с зарплатой 115 тысяч рублей.
Однако ещё во время разработки я понял, что у этого проекта есть потенциал. Казалось, что сайт может стать популярным и, возможно, превратиться в стартап.
По-этому я с самого начала заложил в проект минимальную бизнес-модель, на случай, если сайт начнёт набирать трафик. Я предложил пользователям полный доступ к сайту в обмен на подписку на Telegram-каналы. Это позволяло развивать аудиторию, а в будущем — зарабатывать на рекламе.
Результат превзошёл ожидания!
С момента запуска easyoffer посетило 400 тысяч человек. А когда доход с рекламы превысил мою зарплату программиста, я принял решение уйти с работы и полностью посвятить себя разработке новой версии сайта.
Вот так, зайдя в IT, через 4 месяца вышел через свой же пет-проект. Мне очень повезло
Уже год я работаю над easyoffer 2.0.
Это будет более масштабный и качественной новый проект:
– Появится тренажер
– Появятся задачи из собесов
– Фильтрация контента по грейдам
и еще очень много фич, о которых я расскажу позже.
Хочу, довести easyoffer до ума, чтобы сайт стал настоящим помощником для всех, кто готовится к собеседованиям.
По этому в ближайшее время я объявлю о старте краудфандинговой кампании, чтобы ускорить разработку и я готов щедро отблагодарить всех, кто поддержит проект.
А те, кто поддержат проект первыми, получат специальные лимитированные выгодные вознаграждения. Следите за этим телеграм каналом, если хотите стать первыми сапортерами.
👍9🔥2😁2❤1
Spring – это мощный фреймворк для разработки Java-приложений, который упрощает работу с бэкендом, базами данных и веб-сервисами.
Самый быстрый способ – использовать [Spring Initializr](https://start.spring.io/).
Заходим на [start.spring.io](https://start.spring.io/)
Выбираем:
Maven / Gradle
Java 17+
Spring Boot 3+
Зависимости: Spring Web, Spring Data JPA, PostgreSQL/MySQL (если нужна БД)
Скачиваем и открываем в IntelliJ IDEA или VS Code.
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot JPA + Hibernate -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- Драйвер для PostgreSQL -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<!-- Lombok (автоматически генерирует геттеры/сеттеры) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
Контроллер обрабатывает HTTP-запросы (
GET, POST, PUT, DELETE). @RestController
@RequestMapping("/hello")
public class HelloController {
@GetMapping
public String sayHello() {
return "Привет, Spring!";
}
}
Запрос в браузере
https://localhost:8080/hello
Ответ
Привет, Spring!
Сервисы обрабатывают данные и реализуют бизнес-логику.
@Service
public class UserService {
public String getUserGreeting(String name) {
return "Привет, " + name + "!";
}
}
Использование сервиса в контроллере
@RestController
@RequestMapping("/user")
public class UserController {
private final UserService userService;
@Autowired // Внедрение зависимости
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/{name}")
public String getUserGreeting(@PathVariable String name) {
return userService.getUserGreeting(name);
}
}
Запрос в браузере:
https://localhost:8080/user/Иван
Ответ
Привет, Иван!
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20😁3
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍4
Параметры инициализации могут быть настроены через файл конфигурации
web.xml или с помощью аннотаций в сервлетах. Могут быть настроены для всего веб-приложения или для конкретных сервлетов и страниц.web.xmlМожно настроить в разделе
<servlet> элемента конфигурационного файла web.xml.<web-app>
<servlet>
<servlet-name>ExampleServlet</servlet-name>
<jsp-file>/example.jsp</jsp-file>
<init-param>
<param-name>param1</param-name>
<param-value>value1</param-value>
</init-param>
<init-param>
<param-name>param2</param-name>
<param-value>value2</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ExampleServlet</servlet-name>
<url-pattern>/example</url-pattern>
</servlet-mapping>
</web-app>
Доступ к параметрам инициализации в JSP можно получить через объект
config в JSP.<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Initialization Parameters Example</title>
</head>
<body>
<h1>Initialization Parameters Example</h1>
<%
// Получение параметров инициализации
String param1 = config.getInitParameter("param1");
String param2 = config.getInitParameter("param2");
%>
<p>Param1: <%= param1 %></p>
<p>Param2: <%= param2 %></p>
</body>
</html>
Можно настроить в разделе
<context-param> элемента конфигурационного файла web.xml.<web-app>
<context-param>
<param-name>globalParam1</param-name>
<param-value>globalValue1</param-value>
</context-param>
<context-param>
<param-name>globalParam2</param-name>
<param-value>globalValue2</param-value>
</context-param>
</web-app>
Доступ к параметрам инициализации для всего приложения можно получить через объект
ServletContext.<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Global Initialization Parameters Example</title>
</head>
<body>
<h1>Global Initialization Parameters Example</h1>
<%
// Получение глобальных параметров инициализации
String globalParam1 = application.getInitParameter("globalParam1");
String globalParam2 = application.getInitParameter("globalParam2");
%>
<p>Global Param1: <%= globalParam1 %></p>
<p>Global Param2: <%= globalParam2 %></p>
</body>
</html>
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Это способ хранения информации о состоянии взаимодействия между клиентом и сервером. Она используется для идентификации пользователя, управления его действиями и передачи данных между запросами. Данные сессии хранятся на сервере, а идентификатор сессии передается клиенту через куки или URL.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥5👀2
Forwarded from easyoffer
Ищу работу пол года
Практически под каждым постом в этом канале я вижу комментарии от людей, которые ищут работу по полгода. Это перерастает в обсуждение того, как нужно (или не нужно) искать работу, почему процесс найма сломан и как они откликались на фейковые вакансии.
Честно говоря, искать работу полгода — это нонсенс. Очевидно, что человек делает что-то не так. Главная ошибка, которую совершают многие, — это создание иллюзии поиска работы.
То есть человек вроде бы ищет работу, но делает это неэффективно, тратя время на нецелевые действия. Например:
➖ Просматривает вакансии перед откликом.
➖ Пытается понять, подходит ли он под вакансию. Если считает, что не подходит — не откликается.
➖ Пишет сопроводительные письма (иногда даже уникальные под каждую вакансию).
➖ Заполняет анкеты, проходит тесты.
Все эти действия отнимают время, но не приводят к результату.
Почему это не работает?
HR-менеджер не может вручную отсмотреть 2000 откликов, оценить каждое резюме и прочитать сопроводительные письма. Поэтому компании используют ATS-системы (системы автоматического подбора), которые анализируют резюме и определяют процент его соответствия вакансии.
Что делать, чтобы повысить шансы?
1️⃣ Добавить ключевые навыки в резюме — и в основной текст, и в теги. Возьмите их с easyoffer.ru
2️⃣ Убрать нерелевантный опыт, оставить только подходящий.
3️⃣ Оформить опыт так, чтобы он выглядел релевантным. Если у вас его нет, укажите проекты, стажировки или другой опыт, который можно представить как работу от 1 года. Если опыт слишком большой, сузьте его до 6 лет.
4️⃣ Откликаться на все вакансии без разбору. Если вы Junior, не ищите только стажер или Junior-вакансии — пробуйте везде. Не отказывайте себе сами, пусть это решит HR
5️⃣ Сделать резюме публичным, потому что HR-менеджеры часто ищут кандидатов не только среди откликов, но и в базе резюме.
6️⃣ Используйте ИИ по минимуму – ATS-системы считывают это и помечают "сгенерировано ИИ"
‼️ Главное правило: чем больше откликов — тем выше шанс получить оффер. Делайте резюме удобным для ATS-систем, и вас заметят.
1. Посмотрите видео о том как я вывел свою резюме в Топ1 на HH
2. Посмотрите видео как я нашел первую работу
3. Прочитайте этот кейс про оптимизацию резюме
Если прям вообще тяжело.
Создайте несколько разных резюме. Создайте 2, 3 да хоть 10 резюме. Настройте авто-отлики и ждите приглашения на собесы.
Не нужно создавать иллюзию поиска работы, сделайте несколько простых и актуальных действий.
Практически под каждым постом в этом канале я вижу комментарии от людей, которые ищут работу по полгода. Это перерастает в обсуждение того, как нужно (или не нужно) искать работу, почему процесс найма сломан и как они откликались на фейковые вакансии.
Честно говоря, искать работу полгода — это нонсенс. Очевидно, что человек делает что-то не так. Главная ошибка, которую совершают многие, — это создание иллюзии поиска работы.
То есть человек вроде бы ищет работу, но делает это неэффективно, тратя время на нецелевые действия. Например:
Все эти действия отнимают время, но не приводят к результату.
Почему это не работает?
HR-менеджер не может вручную отсмотреть 2000 откликов, оценить каждое резюме и прочитать сопроводительные письма. Поэтому компании используют ATS-системы (системы автоматического подбора), которые анализируют резюме и определяют процент его соответствия вакансии.
Что делать, чтобы повысить шансы?
1️⃣ Добавить ключевые навыки в резюме — и в основной текст, и в теги. Возьмите их с easyoffer.ru
2️⃣ Убрать нерелевантный опыт, оставить только подходящий.
3️⃣ Оформить опыт так, чтобы он выглядел релевантным. Если у вас его нет, укажите проекты, стажировки или другой опыт, который можно представить как работу от 1 года. Если опыт слишком большой, сузьте его до 6 лет.
4️⃣ Откликаться на все вакансии без разбору. Если вы Junior, не ищите только стажер или Junior-вакансии — пробуйте везде. Не отказывайте себе сами, пусть это решит HR
5️⃣ Сделать резюме публичным, потому что HR-менеджеры часто ищут кандидатов не только среди откликов, но и в базе резюме.
6️⃣ Используйте ИИ по минимуму – ATS-системы считывают это и помечают "сгенерировано ИИ"
‼️ Главное правило: чем больше откликов — тем выше шанс получить оффер. Делайте резюме удобным для ATS-систем, и вас заметят.
1. Посмотрите видео о том как я вывел свою резюме в Топ1 на HH
2. Посмотрите видео как я нашел первую работу
3. Прочитайте этот кейс про оптимизацию резюме
Если прям вообще тяжело.
Создайте несколько разных резюме. Создайте 2, 3 да хоть 10 резюме. Настройте авто-отлики и ждите приглашения на собесы.
Не нужно создавать иллюзию поиска работы, сделайте несколько простых и актуальных действий.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5😁4🤔1
Это уникальный идентификатор версии класса, который используется механизмом сериализации для проверки совместимости классов при десериализации объектов. Он играет ключевую роль в предотвращении ошибок при изменении классов, участвующих в сериализации.
Когда объект сериализуется (превращается в поток байтов), вместе с ним сохраняется и
serialVersionUID. При десериализации JVM сравнивает serialVersionUID сохранённого объекта с serialVersionUID текущего класса. Если они не совпадают, выбрасывается исключение InvalidClassException, так как структура класса могла измениться.Если класс изменяется (например, добавляется новое поле), но
serialVersionUID остаётся неизменным, JVM считает, что класс всё ещё совместим с более старой версией, и десериализация проходит успешно.Если
serialVersionUID не указан явно, JVM генерирует его автоматически на основе структуры класса. Это может привести к неожиданным проблемам, если класс изменится, так как автоматически вычисленный serialVersionUID изменится.import java.io.*;
class Person implements Serializable {
private static final long serialVersionUID = 1L; // Версия класса
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
Если не определить
serialVersionUID, JVM сгенерирует его автоматически. Однако:Он будет зависеть от структуры класса.
Малейшее изменение в коде (даже порядок методов) изменит
serialVersionUID.Это может привести к
InvalidClassException при десериализации.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
1. Через HttpSessionListener:
- Реализуйте этот интерфейс для обработки событий завершения сессии (sessionDestroyed).
2. Через HttpSessionBindingListener:
- Добавьте этот интерфейс в объект, который добавляется в сессию, чтобы он мог отреагировать на удаление.
3. События атрибутов:
- Используйте HttpSessionAttributeListener для уведомления при удалении атрибута из сессии.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍4
Пул строк в Java не является пустым при старте JAR файла. Он изначально содержит несколько предопределенных строковых литералов, которые JVM использует для своей внутренней работы, а также строковые литералы, используемые в загруженных классах и стандартных библиотеках.
JVM и стандартные библиотеки Java используют различные строковые литералы для своей работы. Эти строки добавляются в пул строк при запуске JVM. Примеры таких строк включают имена основных классов и пакетов (например,
"java/lang/Object", "java/lang/String").Когда классы загружаются JVM, все строковые литералы, используемые в этих классах, добавляются в пул строк. Это включает строки, используемые в JAR файле, а также строки из стандартных библиотек Java, которые загружаются при старте.
Для демонстрации этого можно написать простой код, который проверяет, присутствуют ли определенные строки в пуле строк при старте программы.
public class StringPoolDemo {
public static void main(String[] args) {
// Проверка стандартных строк, которые могут быть в пуле строк
String str1 = "java";
String str2 = "lang";
String str3 = "Object";
// Вывод строк
System.out.println("str1: " + str1);
System.out.println("str2: " + str2);
System.out.println("str3: " + str3);
// Проверка строк в пуле строк
System.out.println("Is 'java' in pool: " + (str1 == "java"));
System.out.println("Is 'lang' in pool: " + (str2 == "lang"));
System.out.println("Is 'Object' in pool: " + (str3 == "Object"));
}
}При запуске JVM загружаются системные классы, такие как
java.lang.Object, java.lang.String, java.lang.System, и другие. Строковые литералы, используемые в этих классах, добавляются в пул строк.Когда JVM загружает пользовательские классы из JAR файла, все строковые литералы в этих классах также добавляются в пул строк.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🤔2
1. Фильтры (Filters):
- Создайте фильтр, который проверяет, существует ли активная сессия, и перенаправляет на страницу входа, если сессия недействительна.
2. Настройка безопасности в web.xml:
- Используйте <security-constraint> и роли для ограничения доступа к сервлетам.
3. Проверка в коде:
- Проверяйте сессию непосредственно в сервлете с помощью request.getSession(false).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
Это два интерфейса в JDBC, которые используются для выполнения SQL-запросов к базе данных. Основные различия между ними касаются производительности, безопасности и удобства использования.
Statement используется для выполнения простых SQL-запросов. Запросы формируются и передаются в базу данных в виде строки. Подходит для простых запросов. Не оптимизирован для повторного выполнения. Каждый раз, когда запрос передается в базу данных, он компилируется и выполняется заново. Уязвим к SQL-инъекциям. Поскольку запрос формируется путем конкатенации строк, злоумышленники могут внедрять вредоносный SQL-код.
Statement stmt = connection.createStatement();
String query = "SELECT * FROM employees WHERE department = 'HR'";
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
stmt.close();
PreparedStatement используется для выполнения предварительно скомпилированных SQL-запросов. Это позволяет повысить производительность и безопасность. Оптимизирован для повторного выполнения. Запрос компилируется только один раз, а затем может многократно выполняться с разными параметрами, что повышает производительность. Защита от SQL-инъекций. Использует параметризованные запросы, которые помогают избежать уязвимостей, связанных с SQL-инъекциями. Удобство работы с параметрами. Позволяет устанавливать значения параметров с использованием методов setInt(), setString() и других.
String query = "SELECT * FROM employees WHERE department = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, "HR");
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
pstmt.close();
Statement: Каждый запрос компилируется заново, что снижает производительность при многократном выполнении одного и того же запроса.PreparedStatement: Запрос компилируется один раз и может многократно выполняться с разными параметрами, что повышает производительность.Statement: Уязвим к SQL-инъекциям, поскольку запросы формируются путем конкатенации строк.PreparedStatement: Использует параметризованные запросы, что защищает от SQL-инъекций.Statement: Подходит для простых, одноразовых запросов.PreparedStatement: Удобен для многократного выполнения запросов с разными параметрами.Оба интерфейса могут выполнять запросы типа
SELECT, INSERT, UPDATE, DELETE, но PreparedStatement более удобен для запросов с параметрами.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤1
- Установите SSL-сертификат на сервер (например, через Let’s Encrypt).
- Настройте сервер (Apache, Nginx) для принудительного использования HTTPS.
2. Редирект HTTP → HTTPS:
- Настройте перенаправление на уровне сервера или используйте фильтры.
3. Установите безопасные атрибуты куки:
- Используйте Secure и HttpOnly, чтобы защитить куки от утечки.
4. Шифрование данных:
- Передавайте конфиденциальные данные только через HTTPS.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥7