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
|
@Configurationpublic 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
|
@Beanpublic 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 . |