當前位置:
首頁 > 知識 > spring boot 2.0 經過半月使用給出階段性總結

spring boot 2.0 經過半月使用給出階段性總結

springboot2.0 是包含並基於spring 5 的,而且M7相對於M2也有很不小的改變

freemarker的使用過程中,也有不小的挑戰,因為資料也不算特別多,而且對freemarker的特性也不是很熟

對於前端的框架,因為好久沒用,也是不太熟悉。所以,這三個星期的實戰,不太順利,多次踩坑還沒有太多的資料可查。

首先,kotlin下,springBoot的啟動方式有以下兩種,

1 SpringApplication.run(DemoApplication::class.java,*args)

2 runApplication <DemoApplication>(*args)

方式1,在java下也能使用,在java下的寫法 SpringApplication.run(DemoAllication.class, args)

方法2,只能在kotlin下使用

然後,指定的類文件最好是有@SpringBootApplication 這個註解的類文件,雖然指定其他的controller文件之類的,也能啟動SpringBoot,但是那樣需要額外的配置

(需要增加自動掃描的註解

//@EnableAutoConfiguration

//@ComponentScan(basePackages = ["com.xyz"])

//@EntityScan("com.xyz.entity")

//@EnableJpaRepositories("com.xyz.repository")

,而且那個啟動方式本身就是錯誤的)

@Resource 比 @Autowired 更有效,雖然這兩個註解的用法基本相等,具體原因需要補下spring的原來。。。

在kotlin里,自動裝載的Bean必須要先實例化或者lateinit(緩初始化)

在spring4.3 之後,加入了 @GetMapping @PostMapping等註解來簡化 @RequestMapping

用@Configuration註解該類,等價 與XML中配置beans;用@Bean標註方法等價於XML中配置bean。

需要註冊簡單請求轉發跳轉View的RequestMapping 可以擴展WebMvnConfigurer介面進行重寫(override)

在springBoot 2 中需要注意,因為使用的是spring5了,原先的方法的是 繼承 webMvcConfigurerAdapter抽象類,現在是直接擴展webMvcConfigurer這個介面。原先的方式還能生效,不過已經被5棄用了(@deprecated)

之前需要繼承抽象類完成的工作,現在可以全部通過擴展介面來完成。

通過創建類繼承WebSecurityConfigurerAdapter這個抽象類,可以對Spring Security 框架下的登錄,忽略保護等操作進行修改。

登錄頁面的修改,需要重寫(override)configure(http :HttpSecurity)具體的教材,可以查詢網路,這類教程比較多。

舉個例子:

override funconfigure(http: HttpSecurity) {

http

.authorizeRequests()

.antMatchers("/").permitAll()

.anyRequest().authenticated()

.and()

.formLogin()

.loginPage("/login")

.permitAll()

.and()

.logout()

.logoutUrl("/logout")

.logoutSuccessUrl("/login?logout")

.permitAll()

.and()

.httpBasic()

}

上面的代碼片段里,{ .authorizeRequests().antMatchers("/").permitAll().anyRequest().authenticated()}放行了「/」,但是要求了其他任意請求(anyRequest)都是需要登錄(authenticated)才能查看的。

{.formLogin().loginPage("/login").permitAll()}「formLogin」說明設置的是登錄頁面,指定登錄頁面的mapping是「/login」,並且登錄頁面的mapping准許任何人訪問。

{.logout().logoutUrl("/logout").logoutSuccessUrl("/login?logout").permitAll()},logout功能的mapping「/logout」,註銷後跳轉頁面「/login?logout」,並且登出頁面准許任何情況下訪問(其實應該是不需要permitAll的,按道理來說,登錄了才能註銷嘛)

重寫configure(web : WebSecurity)可以配置webSecurity,比如忽略某些靜態文件的訪問控制,或者其他,具體參見網上的各路教程,以下只給個簡單的例子

override funconfigure(web: WebSecurity) {

web.ignoring()

.antMatchers("/static/**")

.antMatchers("/register/**")

.antMatchers("/error")

}

這個例子是忽略了三個地址,這三個地址不在許可權控制之列。

當然,還有最關鍵的一個地方沒講,繼承WebSecurityConfigurerAdapter最先要做的應該是通過重寫(override)configure(auth : AuthenticationManagerBuilder)方法,從而實現,替換spring Security框架自帶的userDetailsService,從而使用自己的用戶服務,使用自己的用戶認證。(非常重要)

@Bean funuserService() : UserDetailsService = UserService()

override funconfigure(auth : AuthenticationManagerBuilder) {

auth.userDetailsService(userService())

}

自己寫的userDetailsService類也是需要擴展UserDetailsService介面的

控制器類文件在類之前要加@Controller,REST風格的控制器文件,要在前面加@RestController,REST風格的地址方法返回的對象,都會被轉換成JSON對象(除了返回對象為 字元串,數字等基礎類型這個情況)

對於普通控制器,方法返回的可以是String字元串,也可以是ModelAndView。當然,如果是ajax通信,也可以返回一個實體對象。

spring boot 2 使用的是spring5 ,spring 5 的security,所有的post提交,必須要傳token「_csrf.token」,token的name為「_csrf」,不傳token的POST提交都會被405,拒絕掉。

spring security 5 中,使用默認的密碼解析必須傳解碼方法,密碼的格式為{decoder}password

例如,解析不加密的password的密碼應該包裝成

{noop}password

,除非你集成並擴展框架的原來的方法,否則都要遵守這個規則,spring security5系統,提供了包括解碼在內的5種加密方法,具體請看官方文檔。

在spring boot 2 中,已經不能通過寫配置文件來忽略某些地址的安全控制,security.*相關的配置已經全部被棄用

在2中,默認集成的hibernate已經是hibernate5了,請注意5的特性。JPA的配置也是曾經的版本有變化。

以下是MYSQL資料庫,jpa的配置,請注意,網上的教程案例中的spring.jpa.hibernate.naming.strategy也已經被棄用了。請換成implicit-strategy和physical-strategy

spring.jpa.database=MYSQL

spring.jpa.show-sql=true

spring.jpa.hibernate.ddl-auto=update

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

spring.jpa.hibernate.use-new-id-generator-mappings=true

spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

actuator模塊M7版本比M2版本也有很大的變化,其中默認的mapping 由「/application」改成了「/actuator」

web埠下,默認打開的endpoint也很少只有health和status。beans等其他的監控地址,需要另外通過配置來打開。

例子如下:

management.endpoints.web.base-path=/application

management.endpoints.web.expose=*

更具體的情況可以參考官方資料。

以下代碼是更改服務埠和「/static」的mapping地址的兩條配置

server.port= 8000

spring.mvc.static-path-pattern=/static/**

freemarker模版可以使用tld,但是首先需要註冊tld文件的地址

需要擴展WebMvcConfigurer介面,代碼片段如下

@Autowired

private varconfigurer: FreeMarkerConfigurer = FreeMarkerConfigurer()

@PostConstruct

funfreeMarkerConfigurer(){

vartlds : MutableList<String> =mutableListOf()

tlds.add("/META-INF/security.tld")

valtaglibFactory : TaglibFactory =configurer.taglibFactory

taglibFactory.classpathTlds= tlds

if(taglibFactory.objectWrapper==null){

taglibFactory.objectWrapper= configurer.configuration.objectWrapper

}

}

這個是寫在class WebMvcConfig : WebMvcConfigurer 中的

然後需要在使用 security.tld文件的ftl文件中加入

<#assignsecurity=JspTaglibs["http://www.springframework.org/security/tags";]/>

spring security 5 的tlds的lib也有比較大的更改,之前普遍寫法

<@security.authorizeifAnyGranted="ROLE_ADMIN,ROLE_ADD_FILM">

<div>管理員的功能</div>

</@security.authorize>

已經無效了,只能用下面的方式

<@security.authorize access="hasRole("ROLE_ADMIN")">

<div>管理員的功能</div>

</@security.authorize>

其他變化,也請看官方文檔,沒有細看

建議引入的另外一個ftl文件是

<#import"/spring.ftl" as spring />

這個可以解析當前地址之類的,這個是spring提供的ftl文件,便於MVC集成ftl模版文件

freemarker模版中,通過session獲取登錄後,用戶名的方法。

${Session.SPRING_SECURITY_CONTEXT.authentication.principal.username}

想在session中獲取更多的信息,需要重寫或者擴展相關的userdetailsService和集成了UserDetails類的那個文件

注意,在使用freemarker的??符號的時候例如<#ifSession.SPRING_SECURITY_CONTEXT??>如果Session本身就是null,那麼這個FTL命令還是會報錯,有??判斷某個變數的時候,如果這個變數有n個父級,父級有null的情況會報錯。

spring boot 2.0 經過半月使用給出階段性總結

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

為什麼 GitHub 上的開發者比 iOS 上的要更值錢?
Tengine-2.1.0的安裝與配置

TAG:程序員小新人學習 |