Настройка AOP через XML и аннотации
Spring AOP предоставляет два способа конфигурации: через XML и с помощью аннотаций.
1. Настройка AOP через XML
Ранее в Spring было популярно настраивать AOP через XML-конфигурацию.
Шаги настройки
Добавьте зависимость AOP в pom.xml:
Создайте аспект:
Определите Pointcut и Advice в XML:
Объявите аспект в applicationContext.xml:
2. Настройка AOP с помощью аннотаций
Настройка через аннотации является более современным и удобным подходом.
Шаги настройки
Добавьте зависимость:
Включите поддержку AOP в приложении:
Создайте аспект:
Пример сервиса:
#Java #Training #Spring #AOP
Spring AOP предоставляет два способа конфигурации: через XML и с помощью аннотаций.
1. Настройка AOP через XML
Ранее в Spring было популярно настраивать AOP через XML-конфигурацию.
Шаги настройки
Добавьте зависимость AOP в pom.xml:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
Создайте аспект:
public class LoggingAspect {
public void logBefore() {
System.out.println("Logging before method execution...");
}
}
Определите Pointcut и Advice в XML:
<aop:config>
<aop:aspect id="loggingAspect" ref="loggingAspectBean">
<aop:pointcut id="serviceMethods" expression="execution(* com.example.service.*.*(..))" />
<aop:before method="logBefore" pointcut-ref="serviceMethods" />
</aop:aspect>
</aop:config>
Объявите аспект в applicationContext.xml:
<bean id="loggingAspectBean" class="com.example.aspect.LoggingAspect" />
2. Настройка AOP с помощью аннотаций
Настройка через аннотации является более современным и удобным подходом.
Шаги настройки
Добавьте зависимость:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
Включите поддержку AOP в приложении:
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {}
Создайте аспект:
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Before method: " + joinPoint.getSignature().getName());
}
@After("execution(* com.example.service.*.*(..))")
public void logAfter(JoinPoint joinPoint) {
System.out.println("After method: " + joinPoint.getSignature().getName());
}
@Around("execution(* com.example.service.*.*(..))")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Around - Before method: " + joinPoint.getSignature().getName());
Object result = joinPoint.proceed();
System.out.println("Around - After method: " + joinPoint.getSignature().getName());
return result;
}
}
Пример сервиса:
@Service
public class UserService {
public String getUserById(Long id) {
System.out.println("Fetching user with ID: " + id);
return "User" + id;
}
}
#Java #Training #Spring #AOP
Практическое использование AOP для логирования
Логирование является одной из самых распространённых задач, где применяют AOP. Вместо того чтобы добавлять логи в каждый метод вручную, можно создать аспект, который автоматически будет логировать информацию о вызовах методов, их параметрах, результатах и времени выполнения.
1. Задача: Логирование вызовов методов
Cоздадим аспект, который будет:
Логировать вызовы методов сервисного слоя.
Выводить информацию о параметрах методов.
Логировать результат выполнения.
Замерять время выполнения метода.
Шаг 1: Зависимости
Добавьте в pom.xml зависимости для работы с AOP:
Шаг 2: Создание аспекта логирования
Шаг 3: Бизнес-логика
Создадим простой сервис для тестирования:
Шаг 4: Проверка
Теперь вызов методов UserService будет автоматически логироваться:
Пример лога:
#Java #Training #Spring #AOP #AOP_for_logging
Логирование является одной из самых распространённых задач, где применяют AOP. Вместо того чтобы добавлять логи в каждый метод вручную, можно создать аспект, который автоматически будет логировать информацию о вызовах методов, их параметрах, результатах и времени выполнения.
1. Задача: Логирование вызовов методов
Cоздадим аспект, который будет:
Логировать вызовы методов сервисного слоя.
Выводить информацию о параметрах методов.
Логировать результат выполнения.
Замерять время выполнения метода.
Шаг 1: Зависимости
Добавьте в pom.xml зависимости для работы с AOP:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
Шаг 2: Создание аспекта логирования
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@Aspect
@Component
public class LoggingAspect {
// Логируем все методы в сервисном слое
@Around("execution(* com.example.service.*.*(..))")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
System.out.println("Method called: " + joinPoint.getSignature());
System.out.println("Arguments: " + Arrays.toString(joinPoint.getArgs()));
Object result;
try {
result = joinPoint.proceed(); // Выполняем метод
System.out.println("Method result: " + result);
} catch (Throwable ex) {
System.out.println("Method threw an exception: " + ex.getMessage());
throw ex;
}
long elapsedTime = System.currentTimeMillis() - startTime;
System.out.println("Method execution time: " + elapsedTime + " ms");
return result;
}
}
Шаг 3: Бизнес-логика
Создадим простой сервис для тестирования:
import org.springframework.stereotype.Service;
@Service
public class UserService {
public String getUserById(Long id) {
System.out.println("Fetching user from database...");
return "User" + id;
}
public void updateUser(Long id, String name) {
System.out.println("Updating user in database...");
}
}
Шаг 4: Проверка
Теперь вызов методов UserService будет автоматически логироваться:
@RestController
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/users/{id}")
public String getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
@PutMapping("/users/{id}")
public void updateUser(@PathVariable Long id, @RequestBody String name) {
userService.updateUser(id, name);
}
}
Пример лога:
Method called: String com.example.service.UserService.getUserById(Long)
Arguments: [1]
Fetching user from database...
Method result: User1
Method execution time: 5 ms
#Java #Training #Spring #AOP #AOP_for_logging
Что выведет код?
#Tasks
public class Task0612_1 {
public static void main(String[] args) {
Task0612_1 test = new Task0612_1();
test.print(null);
}
public void print(String str) {
System.out.println("String method");
}
public void print(Object obj) {
System.out.println("Object method");
}
public void print(CharSequence seq) {
System.out.println("CharSequence method");
}
}
#Tasks
Варианты ответа:
Anonymous Quiz
31%
Object method
50%
String method
0%
CharSequence method
19%
Compile-time error
Проверка авторизации для выполнения методов
Создадим аспект, который будет:
Проверять, имеет ли пользователь доступ к выполнению метода.
Блокировать вызов метода, если доступ запрещён.
Шаг 1: Создание аннотации для ограничения доступа
Шаг 2: Аспект для проверки безопасности
Шаг 3: Применение аннотации Secured
Теперь можно использовать аннотацию @Secured для методов, которые требуют проверки безопасности.
Шаг 4: Проверка
Создадим контроллер для вызова методов:
Если вызвать метод deleteUser с текущей ролью USER, выбросится исключение:
Шаг 5: Логирование в аспекте
Вы можете расширить аспект, добавив логирование успешных или неуспешных проверок безопасности:
#Java #Training #Spring #AOP #AOP_for_security
Создадим аспект, который будет:
Проверять, имеет ли пользователь доступ к выполнению метода.
Блокировать вызов метода, если доступ запрещён.
Шаг 1: Создание аннотации для ограничения доступа
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Secured {
String role(); // Роль, необходимая для доступа
}
Шаг 2: Аспект для проверки безопасности
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.JoinPoint;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class SecurityAspect {
// Перехватываем методы с аннотацией @Secured
@Before("@annotation(secured)")
public void checkAccess(JoinPoint joinPoint, Secured secured) {
String requiredRole = secured.role();
String userRole = getCurrentUserRole(); // Эмуляция получения роли пользователя
if (!userRole.equals(requiredRole)) {
throw new SecurityException("Access denied: required role is " + requiredRole);
}
System.out.println("Access granted to method: " + joinPoint.getSignature());
}
private String getCurrentUserRole() {
// Для примера, возвращаем роль текущего пользователя
return "USER"; // Например, текущая роль пользователя — "USER"
}
}
Шаг 3: Применение аннотации Secured
Теперь можно использовать аннотацию @Secured для методов, которые требуют проверки безопасности.
import org.springframework.stereotype.Service;
@Service
public class AdminService {
@Secured(role = "ADMIN")
public void deleteUser(Long id) {
System.out.println("Deleting user with ID: " + id);
}
@Secured(role = "USER")
public String getUserData(Long id) {
System.out.println("Fetching user data...");
return "User data for ID: " + id;
}
}
Шаг 4: Проверка
Создадим контроллер для вызова методов:
@RestController
public class AdminController {
private final AdminService adminService;
public AdminController(AdminService adminService) {
this.adminService = adminService;
}
@DeleteMapping("/admin/users/{id}")
public void deleteUser(@PathVariable Long id) {
adminService.deleteUser(id); // Проверка роли ADMIN
}
@GetMapping("/admin/users/{id}")
public String getUserData(@PathVariable Long id) {
return adminService.getUserData(id); // Проверка роли USER
}
}
Если вызвать метод deleteUser с текущей ролью USER, выбросится исключение:
Access denied: required role is ADMIN
Шаг 5: Логирование в аспекте
Вы можете расширить аспект, добавив логирование успешных или неуспешных проверок безопасности:
@Before("@annotation(secured)")
public void checkAccess(JoinPoint joinPoint, Secured secured) {
String requiredRole = secured.role();
String userRole = getCurrentUserRole();
if (!userRole.equals(requiredRole)) {
System.out.println("Access denied for method: " + joinPoint.getSignature());
throw new SecurityException("Access denied: required role is " + requiredRole);
}
System.out.println("Access granted for method: " + joinPoint.getSignature());
}
#Java #Training #Spring #AOP #AOP_for_security
Всем привет!
Для понимания ситуации проведу опрос - откуда Вы узнали о нашем телеграм-канале?
Для понимания ситуации проведу опрос - откуда Вы узнали о нашем телеграм-канале?
Anonymous Poll
14%
По поиску
16%
По каналу в YOUTUBE
3%
По каналу в RUTUBE
43%
Из JavaRush
5%
Друг посоветовал
19%
Я здесь так давно, что и не помню)
This media is not supported in your browser
VIEW IN TELEGRAM
Всем доброго утра! 🖐
Сегодня как и каждое воскресение в 16:00 по МСК мы собираемся чтобы попробовать что-то новое!
Сегодняшняя тема: Деплой приложений
Жду всех. Приходите будет интересно😉
Сегодня как и каждое воскресение в 16:00 по МСК мы собираемся чтобы попробовать что-то новое!
Сегодняшняя тема: Деплой приложений
Жду всех. Приходите будет интересно😉
Деплой приложений. Метод для контейнеризации приложений в Docker. Встреча от 08.12.2024
Запись нашей сегодняшней встречи -
YOUTUBE
RUTUBE
Спасибо всем кто пришел, за участие!💪
На сегодняшней встрече с подписчиками, мы на примере, разобрали:
— что такое архивы JAR, WAR и EAR и для чего они нужны.
— как создать и запускать приложения без IDea.
— как организовать сборку через основные сборщики Maven и Gradle.
— как создать простейшее веб-приложение и задеплоить его на сервер в Docker контейнер.
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Всем хорошего настроения! 🫡✌️
Запись нашей сегодняшней встречи -
YOUTUBE
RUTUBE
Спасибо всем кто пришел, за участие!💪
На сегодняшней встрече с подписчиками, мы на примере, разобрали:
— что такое архивы JAR, WAR и EAR и для чего они нужны.
— как создать и запускать приложения без IDea.
— как организовать сборку через основные сборщики Maven и Gradle.
— как создать простейшее веб-приложение и задеплоить его на сервер в Docker контейнер.
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Всем хорошего настроения! 🫡✌️
Транзакционный менеджмент с помощью AOP
Транзакционный менеджмент — это одна из ключевых функций, где AOP в Spring используется наиболее активно. С помощью AOP можно автоматически управлять транзакциями, устраняя необходимость вручную начинать, коммитить или откатывать транзакции в бизнес-логике.
1. Транзакционный менеджмент: Основы
Транзакция — это единица работы, которая либо выполняется полностью, либо откатывается при возникновении ошибки. Примером транзакции может быть:
Добавление пользователя в базу данных.
Перевод денег между счетами.
Роль AOP в транзакционном менеджменте
Spring AOP позволяет автоматически обрабатывать транзакции:
Начинать транзакцию перед выполнением метода.
Фиксировать транзакцию после успешного выполнения.
Откатывать транзакцию при возникновении исключения.
Аннотация @Transactional
В Spring для работы с транзакциями используется аннотация @Transactional.
2. Пример использования транзакционного менеджмента
Шаг 1: Добавление зависимостей
Добавьте в pom.xml зависимости для Spring Data JPA и базы данных:
Шаг 2: Настройка базы данных
Добавьте настройки H2 в application.properties:
Шаг 3: Бизнес-логика с транзакциями
Создайте сущность:
Репозиторий для работы с данными:
Сервис с транзакционным методом:
Шаг 4: Проверка
Создайте тестовый контроллер:
#Java #Training #Spring #AOP #AOP_Transaction
Транзакционный менеджмент — это одна из ключевых функций, где AOP в Spring используется наиболее активно. С помощью AOP можно автоматически управлять транзакциями, устраняя необходимость вручную начинать, коммитить или откатывать транзакции в бизнес-логике.
1. Транзакционный менеджмент: Основы
Транзакция — это единица работы, которая либо выполняется полностью, либо откатывается при возникновении ошибки. Примером транзакции может быть:
Добавление пользователя в базу данных.
Перевод денег между счетами.
Роль AOP в транзакционном менеджменте
Spring AOP позволяет автоматически обрабатывать транзакции:
Начинать транзакцию перед выполнением метода.
Фиксировать транзакцию после успешного выполнения.
Откатывать транзакцию при возникновении исключения.
Аннотация @Transactional
В Spring для работы с транзакциями используется аннотация @Transactional.
2. Пример использования транзакционного менеджмента
Шаг 1: Добавление зависимостей
Добавьте в pom.xml зависимости для Spring Data JPA и базы данных:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
Шаг 2: Настройка базы данных
Добавьте настройки H2 в application.properties:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
Шаг 3: Бизнес-логика с транзакциями
Создайте сущность:
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
private double balance;
// Getters and Setters
}
Репозиторий для работы с данными:
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {}
Сервис с транзакционным методом:
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Transactional
public void transferMoney(Long fromUserId, Long toUserId, double amount) {
User fromUser = userRepository.findById(fromUserId)
.orElseThrow(() -> new RuntimeException("User not found"));
User toUser = userRepository.findById(toUserId)
.orElseThrow(() -> new RuntimeException("User not found"));
fromUser.setBalance(fromUser.getBalance() - amount);
toUser.setBalance(toUser.getBalance() + amount);
userRepository.save(fromUser);
userRepository.save(toUser);
if (amount > 1000) {
throw new RuntimeException("Transfer limit exceeded!");
}
}
}
Шаг 4: Проверка
Создайте тестовый контроллер:
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@PostMapping("/transfer")
public void transferMoney(@RequestParam Long fromUserId, @RequestParam Long toUserId, @RequestParam double amount) {
userService.transferMoney(fromUserId, toUserId, amount);
}
}
Теперь, если перевести более 1000 единиц, метод выбросит исключение, а все изменения в базе данных будут откатаны.
#Java #Training #Spring #AOP #AOP_Transaction
Что выведет код?
#Tasks
public class Task091224_1 {
public static void main(String[] args) {
Random random = new Random(10);
System.out.println(random.nextInt(100));
random.setSeed(10);
System.out.println(random.nextInt(100));
Random anotherRandom = new Random(10);
System.out.println(anotherRandom.nextInt(100));
random.setSeed(20);
System.out.println(random.nextInt(100));
}
}
#Tasks
Все аннотации AOP и их использование
1. @Aspect
Обозначает класс как аспект.
2. @Pointcut
Определяет срез, на который будет ссылаться Advice.
3. @Before
Совет, выполняющийся перед методом.
4. @After
Совет, выполняющийся после метода, независимо от его результата.
5. @AfterReturning
Совет, выполняющийся после успешного выполнения метода.
6. @AfterThrowing
Совет, выполняющийся при выбросе исключения.
7. @Around
Оборачивает метод, позволяя контролировать его выполнение.
8. @EnableAspectJAutoProxy
Включает поддержку AOP в приложении.
#Java #Training #Spring #AOP #AOP_Annotations
1. @Aspect
Обозначает класс как аспект.
@Aspect
@Component
public class LoggingAspect {
// Pointcut и Advice
}
2. @Pointcut
Определяет срез, на который будет ссылаться Advice.
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceLayer() {}
3. @Before
Совет, выполняющийся перед методом.
@Before("serviceLayer()")
public void logBefore() {
System.out.println("Before method");
}
4. @After
Совет, выполняющийся после метода, независимо от его результата.
@After("serviceLayer()")
public void logAfter() {
System.out.println("After method");
}
5. @AfterReturning
Совет, выполняющийся после успешного выполнения метода.
@AfterReturning(pointcut = "serviceLayer()", returning = "result")
public void logAfterReturning(Object result) {
System.out.println("Method returned: " + result);
}
6. @AfterThrowing
Совет, выполняющийся при выбросе исключения.
@AfterThrowing(pointcut = "serviceLayer()", throwing = "ex")
public void logAfterThrowing(Exception ex) {
System.out.println("Exception thrown: " + ex.getMessage());
}
7. @Around
Оборачивает метод, позволяя контролировать его выполнение.
@Around("serviceLayer()")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Before method");
Object result = joinPoint.proceed();
System.out.println("After method");
return result;
}
8. @EnableAspectJAutoProxy
Включает поддержку AOP в приложении.
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {}
#Java #Training #Spring #AOP #AOP_Annotations
Введение в Spring Security
Spring Security — это мощный и гибкий фреймворк для обеспечения безопасности приложений на платформе Spring. Он предоставляет инструменты для аутентификации и авторизации, защищает от атак и позволяет интегрировать собственные механизмы безопасности.
1. Что такое Spring Security?
Spring Security решает две основные задачи:
Аутентификация — процесс проверки подлинности пользователя.
Авторизация — проверка прав пользователя для выполнения определённых действий.
Ключевые возможности:
Аутентификация и авторизация.
Интеграция с популярными механизмами безопасности (LDAP, OAuth2, JWT).
Защита от атак:
CSRF (Cross-Site Request Forgery).
XSS (Cross-Site Scripting).
Clickjacking.
Шифрование паролей.
Конфигурируемая модель безопасности с возможностью расширения.
2. Основные компоненты Spring Security
2.1 SecurityFilterChain
Основной компонент, который перехватывает HTTP-запросы и применяет к ним правила безопасности.
2.2 AuthenticationManager
Управляет процессом аутентификации. Это центральная точка, которая определяет, прошёл ли пользователь проверку подлинности.
2.3 UserDetailsService
Интерфейс, отвечающий за получение данных пользователя (например, имени и пароля) из базы данных.
2.4 PasswordEncoder
Интерфейс для шифрования и проверки паролей. Самый популярный его реализация — BCryptPasswordEncoder.
2.5 GrantedAuthority
Представляет права пользователя (например, роли).
3. Установка и настройка Spring Security
Шаг 1: Подключение зависимостей
Для работы с Spring Security добавьте зависимости в pom.xml:
Шаг 2: Настройка безопасности
Создайте класс конфигурации:
Шаг 3: Настройка пользователей
Создайте пользователей в памяти для тестирования:
4. Проверка безопасности
Запустите приложение и откройте в браузере:
/user — доступ только для пользователя с ролью USER или ADMIN.
/admin — доступ только для пользователя с ролью ADMIN.
#Java #Training #Spring #Security
Spring Security — это мощный и гибкий фреймворк для обеспечения безопасности приложений на платформе Spring. Он предоставляет инструменты для аутентификации и авторизации, защищает от атак и позволяет интегрировать собственные механизмы безопасности.
1. Что такое Spring Security?
Spring Security решает две основные задачи:
Аутентификация — процесс проверки подлинности пользователя.
Авторизация — проверка прав пользователя для выполнения определённых действий.
Ключевые возможности:
Аутентификация и авторизация.
Интеграция с популярными механизмами безопасности (LDAP, OAuth2, JWT).
Защита от атак:
CSRF (Cross-Site Request Forgery).
XSS (Cross-Site Scripting).
Clickjacking.
Шифрование паролей.
Конфигурируемая модель безопасности с возможностью расширения.
2. Основные компоненты Spring Security
2.1 SecurityFilterChain
Основной компонент, который перехватывает HTTP-запросы и применяет к ним правила безопасности.
2.2 AuthenticationManager
Управляет процессом аутентификации. Это центральная точка, которая определяет, прошёл ли пользователь проверку подлинности.
2.3 UserDetailsService
Интерфейс, отвечающий за получение данных пользователя (например, имени и пароля) из базы данных.
2.4 PasswordEncoder
Интерфейс для шифрования и проверки паролей. Самый популярный его реализация — BCryptPasswordEncoder.
2.5 GrantedAuthority
Представляет права пользователя (например, роли).
3. Установка и настройка Spring Security
Шаг 1: Подключение зависимостей
Для работы с Spring Security добавьте зависимости в pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Шаг 2: Настройка безопасности
Создайте класс конфигурации:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/user/**").hasAnyRole("USER", "ADMIN")
.anyRequest().authenticated()
)
.formLogin()
.and()
.logout();
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Шаг 3: Настройка пользователей
Создайте пользователей в памяти для тестирования:
import org.springframework.context.annotation.Bean;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
@Configuration
public class InMemoryUserDetailsService {
@Bean
public UserDetailsService userDetailsService(PasswordEncoder passwordEncoder) {
UserDetails user = User.withUsername("user")
.password(passwordEncoder.encode("password"))
.roles("USER")
.build();
UserDetails admin = User.withUsername("admin")
.password(passwordEncoder.encode("admin"))
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
}
4. Проверка безопасности
Запустите приложение и откройте в браузере:
/user — доступ только для пользователя с ролью USER или ADMIN.
/admin — доступ только для пользователя с ролью ADMIN.
#Java #Training #Spring #Security
Что выведет код?
#Tasks
import java.util.TreeSet;
public class Task101224_1 {
public static void main(String[] args) {
TreeSet<String> set = new TreeSet<>((s1, s2) -> s2.length() - s1.length());
set.add("one");
set.add("three");
set.add("four");
set.add("two");
set.add("five");
System.out.println(set);
}
}
#Tasks
Варинаты ответа:
Anonymous Quiz
23%
[five, one, two]
23%
[three, five, four]
38%
[three, four, one]
15%
[five, three, two]
В рамках дополнительной информации, устраняем пробел в знаниях по настройке поведения JVM.
Управление JVM (Java Virtual Machine) командами
Управление JVM (Java Virtual Machine) командами — это процесс конфигурации работы JVM через параметры, которые передаются при её запуске. Эти параметры позволяют настраивать поведение JVM, включая управление памятью, настройку сборщика мусора, логирование, отладку и безопасность. Все параметры JVM можно разделить на несколько категорий.
1. Основные типы параметров JVM
1.1. Стандартные параметры
Эти параметры поддерживаются всеми JVM и не зависят от конкретной реализации.
Например:
-cp или -classpath — указывает путь к классам и JAR-файлам.
-Dproperty=value — установка пользовательских системных свойств.
-version — выводит версию JVM.
-help — показывает справку по основным параметрам JVM.
Пример:
1.2. Параметры для настройки памяти
Эти параметры позволяют управлять распределением памяти в JVM:
-Xms<size> — начальный размер кучи (heap).
-Xmx<size> — максимальный размер кучи.
-Xss<size> — размер стека для каждого потока.
-XX:MetaspaceSize=<size> — начальный размер метапространства (метаданных классов).
-XX:MaxMetaspaceSize=<size> — максимальный размер метапространства.
Пример:
1.3. Расширенные параметры (-X и -XX)
Эти параметры специфичны для реализации JVM (обычно HotSpot) и предоставляют дополнительные возможности:
-X параметры: упрощённые параметры, поддерживаемые большинством JVM.
-Xdebug — включает отладку.
-Xloggc:<file> — логирование работы сборщика мусора в файл.
-XX параметры: детальные настройки и эксперименты.
-XX:+UseG1GC — использование сборщика мусора G1.
-XX:ParallelGCThreads=<n> — количество потоков для параллельной сборки мусора.
-XX:+PrintGCDetails — выводит информацию о работе GC.
-XX:+HeapDumpOnOutOfMemoryError — создаёт дамп памяти при переполнении.
Пример:
1.4. Логирование и диагностика
Эти параметры помогают анализировать производительность и поведение JVM:
-verbose:class — выводит информацию о загрузке классов.
-verbose:gc — выводит информацию о работе сборщика мусора.
-Xlog — гибкое управление логированием (начиная с Java 9).
Пример: -Xlog:gc* для логирования всех событий, связанных с GC.
-XX:+UnlockDiagnosticVMOptions — включает диагностические параметры.
Например: -XX:+PrintCompilation — выводит информацию о компиляции JIT.
Пример:
1.5. Параметры безопасности
-Djava.security.manager — включает менеджер безопасности.
-Djava.security.policy=<file> — указывает путь к файлу политики безопасности.
2. Распределение памяти и работа GC
2.1. Память JVM
JVM делит память на несколько областей:
Heap (куча): для объектов.
Metaspace: для метаданных классов (начиная с Java 8).
Stack: для хранения вызовов методов и локальных переменных.
Native Memory: для работы JVM вне управляемой памяти.
2.2. Управление сборщиком мусора (GC)
Выбор GC сильно влияет на производительность:
-XX:+UseSerialGC — однопоточный сборщик мусора.
-XX:+UseParallelGC — многопоточный, ориентирован на максимальную пропускную способность.
-XX:+UseG1GC — G1 (Garbage-First) для больших приложений.
-XX:+UseZGC — Z Garbage Collector для низкой задержки (Java 11+).
-XX:+UseShenandoahGC — Shenandoah для низкой задержки (Java 12+).
3. Управление через команды операционной системы
Помимо параметров JVM, можно использовать команды ОС для управления процессом:
jps — список запущенных JVM.
jstat — статистика памяти и GC.
jmap — информация о памяти (heap dump).
jstack — вывод стека потоков.
jcmd — универсальный инструмент управления JVM.
4. Советы и рекомендации
Используйте флаги -Xlog вместо устаревших -verbose:gc в современных версиях Java.
Настройка памяти (-Xms и -Xmx) должна учитывать нагрузку приложения.
Анализируйте дампы памяти для отладки утечек.
Включайте диагностику (-XX:+UnlockDiagnosticVMOptions) только для тестирования.
#Java #Training #Medium #JVM_Commands
Управление JVM (Java Virtual Machine) командами
Управление JVM (Java Virtual Machine) командами — это процесс конфигурации работы JVM через параметры, которые передаются при её запуске. Эти параметры позволяют настраивать поведение JVM, включая управление памятью, настройку сборщика мусора, логирование, отладку и безопасность. Все параметры JVM можно разделить на несколько категорий.
1. Основные типы параметров JVM
1.1. Стандартные параметры
Эти параметры поддерживаются всеми JVM и не зависят от конкретной реализации.
Например:
-cp или -classpath — указывает путь к классам и JAR-файлам.
-Dproperty=value — установка пользовательских системных свойств.
-version — выводит версию JVM.
-help — показывает справку по основным параметрам JVM.
Пример:
java -cp myapp.jar -Dconfig.file=app.properties com.example.Main
1.2. Параметры для настройки памяти
Эти параметры позволяют управлять распределением памяти в JVM:
-Xms<size> — начальный размер кучи (heap).
-Xmx<size> — максимальный размер кучи.
-Xss<size> — размер стека для каждого потока.
-XX:MetaspaceSize=<size> — начальный размер метапространства (метаданных классов).
-XX:MaxMetaspaceSize=<size> — максимальный размер метапространства.
Пример:
java -Xms512m -Xmx2g MyApp
1.3. Расширенные параметры (-X и -XX)
Эти параметры специфичны для реализации JVM (обычно HotSpot) и предоставляют дополнительные возможности:
-X параметры: упрощённые параметры, поддерживаемые большинством JVM.
-Xdebug — включает отладку.
-Xloggc:<file> — логирование работы сборщика мусора в файл.
-XX параметры: детальные настройки и эксперименты.
-XX:+UseG1GC — использование сборщика мусора G1.
-XX:ParallelGCThreads=<n> — количество потоков для параллельной сборки мусора.
-XX:+PrintGCDetails — выводит информацию о работе GC.
-XX:+HeapDumpOnOutOfMemoryError — создаёт дамп памяти при переполнении.
Пример:
java -XX:+UseG1GC -XX:+PrintGCDetails -XX:MaxHeapFreeRatio=70 MyApp
1.4. Логирование и диагностика
Эти параметры помогают анализировать производительность и поведение JVM:
-verbose:class — выводит информацию о загрузке классов.
-verbose:gc — выводит информацию о работе сборщика мусора.
-Xlog — гибкое управление логированием (начиная с Java 9).
Пример: -Xlog:gc* для логирования всех событий, связанных с GC.
-XX:+UnlockDiagnosticVMOptions — включает диагностические параметры.
Например: -XX:+PrintCompilation — выводит информацию о компиляции JIT.
Пример:
java -Xlog:gc* MyApp
1.5. Параметры безопасности
-Djava.security.manager — включает менеджер безопасности.
-Djava.security.policy=<file> — указывает путь к файлу политики безопасности.
2. Распределение памяти и работа GC
2.1. Память JVM
JVM делит память на несколько областей:
Heap (куча): для объектов.
Metaspace: для метаданных классов (начиная с Java 8).
Stack: для хранения вызовов методов и локальных переменных.
Native Memory: для работы JVM вне управляемой памяти.
2.2. Управление сборщиком мусора (GC)
Выбор GC сильно влияет на производительность:
-XX:+UseSerialGC — однопоточный сборщик мусора.
-XX:+UseParallelGC — многопоточный, ориентирован на максимальную пропускную способность.
-XX:+UseG1GC — G1 (Garbage-First) для больших приложений.
-XX:+UseZGC — Z Garbage Collector для низкой задержки (Java 11+).
-XX:+UseShenandoahGC — Shenandoah для низкой задержки (Java 12+).
3. Управление через команды операционной системы
Помимо параметров JVM, можно использовать команды ОС для управления процессом:
jps — список запущенных JVM.
jstat — статистика памяти и GC.
jmap — информация о памяти (heap dump).
jstack — вывод стека потоков.
jcmd — универсальный инструмент управления JVM.
4. Советы и рекомендации
Используйте флаги -Xlog вместо устаревших -verbose:gc в современных версиях Java.
Настройка памяти (-Xms и -Xmx) должна учитывать нагрузку приложения.
Анализируйте дампы памяти для отладки утечек.
Включайте диагностику (-XX:+UnlockDiagnosticVMOptions) только для тестирования.
#Java #Training #Medium #JVM_Commands