1. 程式人生 > >spring boot 2.0 半月的實戰_階段性總結1

spring boot 2.0 半月的實戰_階段性總結1

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 fun configure (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 fun configure (web: WebSecurity) { web.ignoring() .antMatchers( "/static/**" ) .antMatchers( "/register/**" ) .antMatchers( "/error" ) }
這個例子是忽略了三個地址,這三個地址不在許可權控制之列。
當然,還有最關鍵的一個地方沒講,繼承WebSecurityConfigurerAdapter最先要做的應該是通過重寫(override)configure(auth : AuthenticationManagerBuilder)方法,從而實現,替換spring Security框架自帶的userDetailsService,從而使用自己的使用者服務,使用自己的使用者認證。(非常重要)
@Bean fun userService () : UserDetailsService = UserService()
override fun configure (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 var configurer : FreeMarkerConfigurer = FreeMarkerConfigurer()
@PostConstruct fun freeMarkerConfigurer (){ var tlds : MutableList<String> = mutableListOf () tlds.add( "/META-INF/security.tld" ) val taglibFactory : TaglibFactory = configurer . taglibFactory taglibFactory. classpathTlds = tlds
if (taglibFactory. objectWrapper == null ){ taglibFactory. objectWrapper = configurer . configuration . objectWrapper } } 這個是寫在 class WebMvcConfig : WebMvcConfigurer 中的
然後需要在使用 security.tld檔案的ftl檔案中加入
<#assign security=JspTaglibs[ " http://www.springframework.org/security/tags" ; ] /> spring security 5 的tlds的lib也有比較大的更改,之前普遍寫法 <@ security.authorize ifAnyGranted=" 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的??符號的時候例如 <#if Session.SPRING_SECURITY_CONTEXT ?? >如果Session本身就是null,那麼這個FTL命令還是會報錯,有??判斷某個變數的時候,如果這個變數有n個父級,父級有null的情況會報錯。
demo 的 github 地址  點選開啟連結