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的情況會報錯。
※為什麼 GitHub 上的開發者比 iOS 上的要更值錢?
※Tengine-2.1.0的安裝與配置
TAG:程序員小新人學習 |