Статьи

Spring MVC 4 Быстрый старт Maven Archetype Улучшено

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 .

использованная литература