Spring Boot позволяет легко начать работу с Spring. Но все еще есть люди, заинтересованные в том, чтобы не использовать Spring Boot и загружать приложение более классическим способом. Несколько лет назад я создал архетип (задолго до Spring Boot), который упрощает загрузку веб-приложений Spring. Хотя Spring Boot уже некоторое время на рынке, Spring MVC 4 Quickstart Maven Archetype все еще является довольно популярным проектом на GitHub . С некоторыми недавними дополнениями я надеюсь, что это даже лучше.
Java 8
Я решил переключить целевую платформу на Java 8. В сгенерированном проекте еще нет конкретного кода Java 8, но я считаю, что все новые проекты Spring должны быть запущены с Java 8. Принятие Java 8 опережает прогнозы. Взгляните на: https://typesafe.com/company/news/survey-of-more-than-3000-developers-reveals-java-8-adoption-ahead-of-previous-forecasts
Представляем Spring IO Platform
Spring IO Platform объединяет основные API-интерфейсы Spring в единую платформу для современных приложений. , Основным преимуществом является то, что он упрощает управление зависимостями, предоставляя версии проектов Spring вместе с их зависимостями, которые были протестированы и работают вместе.
Ранее все зависимости указывались вручную, а решение конфликтов версий занимало некоторое время. С платформой Spring IO мы должны изменить только версию платформы (и, конечно, позаботиться о зависимостях вне платформы):
01
02
03
04
05
06
07
08
09
10
11
|
< dependencyManagement > < dependencies > < dependency > < groupId >io.spring.platform</ groupId > < artifactId >platform-bom</ artifactId > < version >${io.spring.platform-version}</ version > < type >pom</ type > < scope >import</ scope > </ dependency > </ dependencies > </ dependencyManagement > |
Теперь можно использовать зависимости без указания version
в POM:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
<!-- Spring --> < dependency > < groupId >org.springframework</ groupId > < artifactId >spring-webmvc</ artifactId > </ dependency > <!-- Security --> < dependency > < groupId >org.springframework.security</ groupId > < artifactId >spring-security-config</ artifactId > </ dependency > < dependency > < groupId >org.springframework.security</ groupId > < artifactId >spring-security-web</ artifactId > </ dependency > |
Настройка безопасности Java
Когда я впервые создал архетип, у меня не было возможности настроить Spring Security с использованием кода Java. Но теперь это так, поэтому я перенес конфигурацию XML в конфигурацию Java.
SecurityConfig
теперь расширяется от @Configuration
и @EnableWebMvcSecurity
аннотациями @Configuration
и @EnableWebMvcSecurity
.
Детали конфигурации безопасности
Ограничить доступ к каждому URL кроме
Конфигурация XML:
1
2
3
4
|
< security:intercept-url pattern = "/" access = "permitAll" /> < security:intercept-url pattern = "/resources/**" access = "permitAll" /> < security:intercept-url pattern = "/signup" access = "permitAll" /> < security:intercept-url pattern = "/**" access = "isAuthenticated()" /> |
стали:
1
2
3
4
|
http .authorizeRequests() .antMatchers( "/" , "/resources/**" , "/signup" ).permitAll() .anyRequest().authenticated() |
Вход / Выход
Конфигурация XML:
1
2
|
< security:form-login login-page = "/signin" authentication-failure-url = "/signin?error=1" /> < security:logout logout-url = "/logout" /> |
стали:
01
02
03
04
05
06
07
08
09
10
11
|
http .formLogin() .loginPage( "/signin" ) .permitAll() .failureUrl( "/signin?error=1" ) .loginProcessingUrl( "/authenticate" ) .and() .logout() .logoutUrl( "/logout" ) .permitAll() .logoutSuccessUrl( "/signin?logout" ); |
Запомните меня
Конфигурация XML:
1
|
< security:remember-me services-ref = "rememberMeServices" key = "remember-me-key" /> |
стали:
1
2
3
4
|
http .rememberMe() .rememberMeServices(rememberMeServices()) .key( "remember-me-key" ); |
CSRF включен для производства и отключен для тестирования
В настоящее время CSRF включен по умолчанию, поэтому дополнительная настройка не требуется. Но в случае интеграционных тестов я хотел быть уверен, что CSRF отключен. Я не мог найти хороший способ сделать это. Я начал с сопоставления защиты CSRF, переданного в CsrfConfigurer
, но в результате у меня CsrfConfigurer
много кода, который мне не нравился в SecurityConfiguration
. Я закончил с NoCsrfSecurityConfig
который расширяет исходный SecurityConfig
и отключенный CSRF:
1
2
3
4
5
6
7
8
|
@Configuration public class NoCsrfSecurityConfig extends SecurityConfig { @Override protected void configure(HttpSecurity http) throws Exception { super .configure(http); http.csrf().disable(); } } |
Пул подключений
HikariCP теперь используется как пул соединений по умолчанию в сгенерированном приложении. Используется конфигурация по умолчанию:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
@Bean public DataSource configureDataSource() { HikariConfig config = new HikariConfig(); config.setDriverClassName(driver); config.setJdbcUrl(url); config.setUsername(username); config.setPassword(password); config.addDataSourceProperty( "cachePrepStmts" , "true" ); config.addDataSourceProperty( "prepStmtCacheSize" , "250" ); config.addDataSourceProperty( "prepStmtCacheSqlLimit" , "2048" ); config.addDataSourceProperty( "useServerPrepStmts" , "true" ); return new HikariDataSource(config); } |
Еще не все
Spring MVC 4 Quickstart Maven Archetype далек от завершения. Поскольку платформа Spring включает в себя архетип, его необходимо соответствующим образом скорректировать. Я с нетерпением жду возможности услышать, что можно улучшить, чтобы сделать этот проект лучше. Если у вас есть идея или предложение, оставьте комментарий или создайте проблему на GitHub .
использованная литература
Ссылка: | Spring MVC 4 Быстрый старт Maven Archetype Улучшено от нашего партнера JCG Рафаля Боровца в блоге Codeleak.pl . |