欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Security基本原理詳解

 更新時(shí)間:2023年05月06日 09:52:37   作者:愛(ài)上口袋的天空  
這篇文章主要介紹了Spring Security基本原理詳解,springsecurity底層實(shí)現(xiàn)為一條過(guò)濾器鏈,就是用戶(hù)請(qǐng)求進(jìn)來(lái),判斷有沒(méi)有請(qǐng)求的權(quán)限,拋出異常,重定向跳轉(zhuǎn),需要的朋友可以參考下

1、SpringSecurity 本質(zhì)是一個(gè)過(guò)濾器鏈

SpringSecurity 采用的是責(zé)任鏈的設(shè)計(jì)模式,它有一條很長(zhǎng)的過(guò)濾器鏈?,F(xiàn)在對(duì)這條過(guò)濾器鏈的各個(gè)進(jìn)行說(shuō)明:

  1. WebAsyncManagerIntegrationFilter:將 Security 上下文與 Spring Web 中用于處理異步請(qǐng)求映射的 WebAsyncManager 進(jìn)行集成。
  2. SecurityContextPersistenceFilter:在每次請(qǐng)求處理之前將該請(qǐng)求相關(guān)的安全上下文信息加載到 SecurityContextHolder 中,然后在該次請(qǐng)求處理完成之后,將 SecurityContextHolder 中關(guān)于這次請(qǐng)求的信息存儲(chǔ)到一個(gè)“倉(cāng)儲(chǔ)”中,然后將 SecurityContextHolder 中的信息清除,例如在Session中維護(hù)一個(gè)用戶(hù)的安全信息就是這個(gè)過(guò)濾器處理的。
  3. HeaderWriterFilter:用于將頭信息加入響應(yīng)中。
  4. CsrfFilter:用于處理跨站請(qǐng)求偽造
  5. LogoutFilter:用于處理退出登錄。
  6. UsernamePasswordAuthenticationFilter:用于處理基于表單的登錄請(qǐng)求,從表單中獲取用戶(hù)名和密碼。默認(rèn)情況下處理來(lái)自 /login 的請(qǐng)求。從表單中獲取用戶(hù)名和密碼時(shí),默認(rèn)使用的表單 name 值為 username 和 password,這兩個(gè)值可以通過(guò)設(shè)置這個(gè)過(guò)濾器的usernameParameter 和 passwordParameter 兩個(gè)參數(shù)的值進(jìn)行修改。
  7. DefaultLoginPageGeneratingFilter:如果沒(méi)有配置登錄頁(yè)面,那系統(tǒng)初始化時(shí)就會(huì)配置這個(gè)過(guò)濾器,并且用于在需要進(jìn)行登錄時(shí)生成一個(gè)登錄表單頁(yè)面。
  8. BasicAuthenticationFilter:檢測(cè)和處理 http basic 認(rèn)證。
  9. RequestCacheAwareFilter:用來(lái)處理請(qǐng)求的緩存。
  10. SecurityContextHolderAwareRequestFilter:主要是包裝請(qǐng)求對(duì)象request。
  11. AnonymousAuthenticationFilter:檢測(cè) SecurityContextHolder 中是否存在 Authentication 對(duì)象,如果不存在為其提供一個(gè)匿名 Authentication。
  12. SessionManagementFilter:管理 session 的過(guò)濾器
  13. ExceptionTranslationFilter:處理 AccessDeniedException 和 AuthenticationException 異常。
  14. FilterSecurityInterceptor:可以看做過(guò)濾器鏈的出口。
  15. RememberMeAuthenticationFilter:當(dāng)用戶(hù)沒(méi)有登錄而直接訪問(wèn)資源時(shí), 從 cookie 里找出用戶(hù)的信息, 如果 Spring Security 能夠識(shí)別出用戶(hù)提供的remember me cookie, 用戶(hù)將不必填寫(xiě)用戶(hù)名和密碼, 而是直接登錄進(jìn)入系統(tǒng),該過(guò)濾器默認(rèn)不開(kāi)啟。

2、SpringSecurity 流程圖

先來(lái)看下面一個(gè) Spring Security 執(zhí)行流程圖,只要把 SpringSecurity 的執(zhí)行過(guò)程弄明白了,這個(gè)框架就會(huì)變得很簡(jiǎn)單:

流程說(shuō)明

  1. 客戶(hù)端發(fā)起一個(gè)請(qǐng)求,進(jìn)入 Security 過(guò)濾器鏈。
  2. 當(dāng)?shù)?LogoutFilter 的時(shí)候判斷是否是登出路徑,如果是登出路徑則到 logoutHandler ,如果登出成功則到 logoutSuccessHandler 登出成功處理,如果登出失敗則由 ExceptionTranslationFilter ;如果不是登出路徑則直接進(jìn)入下一個(gè)過(guò)濾器。
  3. 當(dāng)?shù)?UsernamePasswordAuthenticationFilter 的時(shí)候判斷是否為登錄路徑,如果是,則進(jìn)入該過(guò)濾器進(jìn)行登錄操作,如果登錄失敗則到 AuthenticationFailureHandler 登錄失敗處理器處理,如果登錄成功則到 AuthenticationSuccessHandler 登錄成功處理器處理,如果不是登錄請(qǐng)求則不進(jìn)入該過(guò)濾器。
  4. 當(dāng)?shù)?FilterSecurityInterceptor 的時(shí)候會(huì)拿到 uri ,根據(jù) uri 去找對(duì)應(yīng)的鑒權(quán)管理器,鑒權(quán)管理器做鑒權(quán)工作,鑒權(quán)成功則到 Controller 層否則到 AccessDeniedHandler 鑒權(quán)失敗處理器處理。

3、Security 配置

在 WebSecurityConfigurerAdapter 這個(gè)類(lèi)里面可以完成上述流程圖的所有配置

配置類(lèi)偽代碼

@Configuration	
@EnableWebSecurity	
public class SecurityConfig extends WebSecurityConfigurerAdapter {	
    @Override	
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {	
        auth.userDetailsService(userDetailService).passwordEncoder(new BCryptPasswordEncoder());	
    }	
    @Override	
    public void configure(WebSecurity web) throws Exception {	
        web.ignoring().antMatchers("/resources/**/*.html", "/resources/**/*.js");	
    }	
    @Override	
    protected void configure(HttpSecurity http) throws Exception {	
       http	
       .formLogin()	
       .loginPage("/login_page")	
       .passwordParameter("username")	
       .passwordParameter("password")	
       .loginProcessingUrl("/sign_in")	
       .permitAll()	
       .and().authorizeRequests().antMatchers("/test").hasRole("test")	
       .anyRequest().authenticated().accessDecisionManager(accessDecisionManager())	
       .and().logout().logoutSuccessHandler(new MyLogoutSuccessHandler())	
       .and().csrf().disable();	
       http.addFilterAt(getAuthenticationFilter(),UsernamePasswordAuthenticationFilter.class);	
       http.exceptionHandling().accessDeniedHandler(new MyAccessDeniedHandler());	
       http.addFilterAfter(new MyFittler(), LogoutFilter.class);	
    }	
}

配置簡(jiǎn)介

  • configure(AuthenticationManagerBuilder auth)

AuthenticationManager 的建造器,配置 AuthenticationManagerBuilder 會(huì)讓Security 自動(dòng)構(gòu)建一個(gè) AuthenticationManager(該類(lèi)的功能參考流程圖);如果想要使用該功能你需要配置一個(gè) UserDetailService 和 PasswordEncoder。UserDetailsService 用于在認(rèn)證器中根據(jù)用戶(hù)傳過(guò)來(lái)的用戶(hù)名查找一個(gè)用戶(hù), PasswordEncoder 用于密碼的加密與比對(duì),我們存儲(chǔ)用戶(hù)密碼的時(shí)候用PasswordEncoder.encode() 加密存儲(chǔ),在認(rèn)證器里會(huì)調(diào)用 PasswordEncoder.matches() 方法進(jìn)行密碼比對(duì)。如果重寫(xiě)了該方法,Security 會(huì)啟用 DaoAuthenticationProvider 這個(gè)認(rèn)證器,該認(rèn)證就是先調(diào)用 UserDetailsService.loadUserByUsername 然后使用 PasswordEncoder.matches() 進(jìn)行密碼比對(duì),如果認(rèn)證成功成功則返回一個(gè) Authentication 對(duì)象。

  • configure(WebSecurity web)

這個(gè)配置方法用于配置靜態(tài)資源的處理方式,可使用 Ant 匹配規(guī)則。

  • configure(HttpSecurity http)

這個(gè)配置方法是最關(guān)鍵的方法,也是最復(fù)雜的方法。我們慢慢掰開(kāi)來(lái)說(shuō):

http	
.formLogin()	
.loginPage("/login_page")	
.passwordParameter("username")	
.passwordParameter("password")	
.loginProcessingUrl("/sign_in")	
.permitAll()

這是配置登錄相關(guān)的操作從方法名可知,配置了登錄頁(yè)請(qǐng)求路徑,密碼屬性名,用戶(hù)名屬性名,和登錄請(qǐng)求路徑,permitAll()代表任意用戶(hù)可訪問(wèn)。

http	
.authorizeRequests()	
.antMatchers("/test").hasRole("test")	
.anyRequest().authenticated()	
.accessDecisionManager(accessDecisionManager());

以上配置是權(quán)限相關(guān)的配置,配置了一個(gè) /test url 該有什么權(quán)限才能訪問(wèn), anyRequest() 表示所有請(qǐng)求,authenticated() 表示已登錄用戶(hù)才能訪問(wèn), accessDecisionManager() 表示綁定在 url 上的鑒權(quán)管理器

為了對(duì)比,現(xiàn)在貼出另一個(gè)權(quán)限配置清單:

http.authorizeRequests()	
.antMatchers("/tets_a/**","/test_b/**").hasRole("test")	
.antMatchers("/a/**","/b/**").authenticated()	
.accessDecisionManager(accessDecisionManager())

我們可以看到權(quán)限配置的自由度很高,鑒權(quán)管理器可以綁定到任意 url 上;而且可以硬編碼各種 url 權(quán)限:

http	
.logout()	
.logoutUrl("/logout")	
.logoutSuccessHandler(new MyLogoutSuccessHandler())

登出相關(guān)配置,這里配置了登出 url 和登出成功處理器:

http	
.exceptionHandling()	
.accessDeniedHandler(new MyAccessDeniedHandler());

上面代碼是配置鑒權(quán)失敗的處理器。

http.addFilterAfter(new MyFittler(), LogoutFilter.class);	
http.addFilterAt(getAuthenticationFilter(),UsernamePasswordAuthenticationFilter.class);

上面代碼展示如何在過(guò)濾器鏈中插入自己的過(guò)濾器,addFilterBefore 加在對(duì)應(yīng)的過(guò)濾器之前,addFilterAfter 加在對(duì)應(yīng)的過(guò)濾器之后,addFilterAt 加在過(guò)濾器同一位置,事實(shí)上框架原有的 Filter 在啟動(dòng) HttpSecurity 配置的過(guò)程中,都由框架完成了其一定程度上固定的配置,是不允許更改替換的。根據(jù)測(cè)試結(jié)果來(lái)看,調(diào)用 addFilterAt 方法插入的 Filter ,會(huì)在這個(gè)位置上的原有 Filter 之前執(zhí)行。

注:關(guān)于 HttpSecurity 使用的是鏈?zhǔn)骄幊蹋渲?http.xxxx.and.yyyyy 這種寫(xiě)法和 http.xxxx;http.yyyy 寫(xiě)法意義一樣。

  • 自定義 AuthenticationManager 和 AccessDecisionManager

重寫(xiě) authenticationManagerBean() 方法,并構(gòu)造一個(gè) authenticationManager:

@Override	
public AuthenticationManager authenticationManagerBean() throws Exception {	
    ProviderManager authenticationManager = new ProviderManager(Arrays.asLis(getMyAuthenticationProvider(),daoAuthenticationProvider()));	
    return authenticationManager;	
}

我這里給 authenticationManager 配置了兩個(gè)認(rèn)證器,執(zhí)行過(guò)程參考流程圖。

定義構(gòu)造AccessDecisionManager的方法并在配置類(lèi)中調(diào)用,配置參考 configure(HttpSecurity http) 說(shuō)明:

public AccessDecisionManager accessDecisionManager(){	
    List<AccessDecisionVoter<? extends Object>> decisionVoters	
            = Arrays.asList(	
            new MyExpressionVoter(),	
            new WebExpressionVoter(),	
            new RoleVoter(),	
            new AuthenticatedVoter());	
    return new UnanimousBased(decisionVoters);	
}

投票管理器會(huì)收集投票器投票結(jié)果做統(tǒng)計(jì),最終結(jié)果大于等于0代表通過(guò);每個(gè)投票器會(huì)返回三個(gè)結(jié)果:-1(反對(duì)),0(通過(guò)),1(贊成)。

4、Security 權(quán)限系統(tǒng)

  • UserDetails

Security 中的用戶(hù)接口,我們自定義用戶(hù)類(lèi)要實(shí)現(xiàn)該接口。

  • GrantedAuthority

Security 中的用戶(hù)權(quán)限接口,自定義權(quán)限需要實(shí)現(xiàn)該接口:

public class MyGrantedAuthority implements GrantedAuthority {	
    private String authority;	
}

authority 表示權(quán)限字段,需要注意的是在 config 中配置的權(quán)限會(huì)被加上 ROLE_ 前綴,比如我們的配置 authorizeRequests().antMatchers("/test").hasRole("test"),配置了一個(gè) test 權(quán)限但我們存儲(chǔ)的權(quán)限字段(authority)應(yīng)該是 ROLE_test 。

  • UserDetailsService

Security 中的用戶(hù) Service,自定義用戶(hù)服務(wù)類(lèi)需要實(shí)現(xiàn)該接口:

@Service	
public class MyUserDetailService implements UserDetailsService {	
    @Override	
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {	
      return.....	
    }	
}

loadUserByUsername的作用在上文中已經(jīng)說(shuō)明,就是根據(jù)用戶(hù)名查詢(xún)用戶(hù)對(duì)象。

  • SecurityContextHolder

用戶(hù)在完成登錄后 Security 會(huì)將用戶(hù)信息存儲(chǔ)到這個(gè)類(lèi)中,之后其他流程需要得到用戶(hù)信息時(shí)都是從這個(gè)類(lèi)中獲得,用戶(hù)信息被封裝成 SecurityContext ,而實(shí)際存儲(chǔ)的類(lèi)是 SecurityContextHolderStrategy ,默認(rèn)的SecurityContextHolderStrategy 實(shí)現(xiàn)類(lèi)是 ThreadLocalSecurityContextHolderStrategy 它使用了ThreadLocal來(lái)存儲(chǔ)了用戶(hù)信息。

手動(dòng)填充 SecurityContextHolder 示例:

UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("test","test",list);	
SecurityContextHolder.getContext().setAuthentication(token);

對(duì)于使用 token 鑒權(quán)的系統(tǒng),我們就可以驗(yàn)證token后手動(dòng)填充SecurityContextHolder,填充時(shí)機(jī)只要在執(zhí)行投票器之前即可,或者干脆可以在投票器中填充,然后在登出操作中清空SecurityContextHolder。

5、Security 擴(kuò)展

Security 可擴(kuò)展的有

  1. 鑒權(quán)失敗處理器
  2. 驗(yàn)證器
  3. 登錄成功處理器
  4. 投票器
  5. 自定義token處理過(guò)濾器
  6. 登出成功處理器
  7. 登錄失敗處理器
  8. 自定義 UsernamePasswordAuthenticationFilter
  • 鑒權(quán)失敗處理器

Security 鑒權(quán)失敗默認(rèn)跳轉(zhuǎn)登錄頁(yè)面,我們可以實(shí)現(xiàn) AccessDeniedHandler 接口,重寫(xiě) handle() 方法來(lái)自定義處理邏輯;然后參考配置類(lèi)說(shuō)明將處理器加入到配置當(dāng)中。

  • 驗(yàn)證器

實(shí)現(xiàn) AuthenticationProvider 接口來(lái)實(shí)現(xiàn)自己驗(yàn)證邏輯。需要注意的是在這個(gè)類(lèi)里面就算你拋出異常,也不會(huì)中斷驗(yàn)證流程,而是算你驗(yàn)證失敗,我們由流程圖知道,只要有一個(gè)驗(yàn)證器驗(yàn)證成功,就算驗(yàn)證成功,所以你需要留意這一點(diǎn)。

  • 登錄成功處理器

在 Security 中驗(yàn)證成功默認(rèn)跳轉(zhuǎn)到上一次請(qǐng)求頁(yè)面或者路徑為 "/" 的頁(yè)面,我們同樣可以自定義:繼承 SimpleUrlAuthenticationSuccessHandler 這個(gè)類(lèi)或者實(shí)現(xiàn) AuthenticationSuccessHandler 接口。我這里建議采用繼承的方式,SimpleUrlAuthenticationSuccessHandler 是默認(rèn)的處理器,采用繼承可以契合里氏替換原則,提高代碼的復(fù)用性和避免不必要的錯(cuò)誤。

  • 投票器

投票器可繼承 WebExpressionVoter 或者實(shí)現(xiàn) AccessDecisionVoter接口;WebExpressionVoter 是 Security 默認(rèn)的投票器;我這里同樣建議采用繼承的方式;添加到配置的方式參考 上文;

注意:投票器 vote 方法返回一個(gè)int值;-1代表反對(duì),0代表?xiàng)墮?quán),1代表贊成;投票管理器收集投票結(jié)果,如果最終結(jié)果大于等于0則放行該請(qǐng)求。

  • 自定義token處理過(guò)濾器

自定義 token 處理器繼承自 OncePerRequestFilter 或者 GenericFilterBean 或者 Filter 都可以,在這個(gè)處理器里面需要完成的邏輯是:獲取請(qǐng)求里的 token,驗(yàn)證 token 是否合法然后填充 SecurityContextHolder ,雖然說(shuō)過(guò)濾器只要添加在投票器之前就可以,但我這里還是建議添加在 http.addFilterAfter(new MyFittler(), LogoutFilter.class);

  • 登出成功處理器

實(shí)現(xiàn)LogoutSuccessHandler接口,添加到配置的方式參考上文。

  • 登錄失敗處理器

登錄失敗默認(rèn)跳轉(zhuǎn)到登錄頁(yè),我們同樣可以自定義。繼承 SimpleUrlAuthenticationFailureHandler 或者實(shí)現(xiàn) AuthenticationFailureHandler,建議采用繼承。

  • 自定義UsernamePasswordAuthenticationFilter

我們自定義UsernamePasswordAuthenticationFilter可以極大提高我們 Security的靈活性(比如添加驗(yàn)證驗(yàn)證碼是否正確的功能)。

我們直接繼承 UsernamePasswordAuthenticationFilter ,然后在配置類(lèi)中初始化這個(gè)過(guò)濾器,給這個(gè)過(guò)濾器添加登錄失敗處理器,登錄成功處理器,登錄管理器,登錄請(qǐng)求 url 。

這里配置略微復(fù)雜,貼一下代碼清單

初始化過(guò)濾器:

MyUsernamePasswordAuthenticationFilte getAuthenticationFilter(){	
    MyUsernamePasswordAuthenticationFilter myUsernamePasswordAuthenticationFilter = new MyUsernamePasswordAuthenticationFilter(redisService);	
    myUsernamePasswordAuthenticationFilter.setAuthenticationFailureHandler(new MyUrlAuthenticationFailureHandler());	
    myUsernamePasswordAuthenticationFilter.setAuthenticationSuccessHandler(new MyAuthenticationSuccessHandler());	
    myUsernamePasswordAuthenticationFilter.setFilterProcessesUrl("/sign_in");	
    myUsernamePasswordAuthenticationFilter.setAuthenticationManager(getAuthenticationManager());	
    return myUsernamePasswordAuthenticationFilter;	
}

添加到配置:

http.addFilterAt(getAuthenticationFilter(),UsernamePasswordAuthenticationFilter.class);

 6、總結(jié)

對(duì)于 Security 的擴(kuò)展配置關(guān)鍵在于 configure(HttpSecurityhttp) 方法;擴(kuò)展認(rèn)證方式可以自定義 authenticationManager 并加入自己驗(yàn)證器,在驗(yàn)證器中拋出異常不會(huì)終止驗(yàn)證流程;擴(kuò)展鑒權(quán)方式可以自定義 accessDecisionManager 然后添加自己的投票器并綁定到對(duì)應(yīng)的 url(url 匹配方式為 ant)上,投票器 vote(Authenticationauthentication,FilterInvocationfi,Collection<ConfigAttribute>attributes) 方法返回值為三種:-1 0 1,分別表示反對(duì)棄權(quán)贊成。

對(duì)于 token 認(rèn)證的校驗(yàn)方式,可以暴露一個(gè)獲取的接口,或者重寫(xiě) UsernamePasswordAuthenticationFilter 過(guò)濾器和擴(kuò)展登錄成功處理器來(lái)獲取 token,然后在 LogoutFilter 之后添加一個(gè)自定義過(guò)濾器,用于校驗(yàn)和填充 SecurityContextHolder。

另外,Security 的處理器大部分都是重定向的,我們的項(xiàng)目如果是前后端分離的話,我們希望無(wú)論什么情況都返回 json ,那么就需要重寫(xiě)各個(gè)處理器了。

到此這篇關(guān)于Spring Security基本原理詳解的文章就介紹到這了,更多相關(guān)Spring Security原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中各種集合判空方法總結(jié)

    Java中各種集合判空方法總結(jié)

    最近接觸集合比較多,經(jīng)常對(duì)于集合是否為空做判斷,下面這篇文章主要給大家介紹了關(guān)于Java中各種集合判空方法總結(jié)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • 詳解SpringMVC中的異常處理機(jī)制

    詳解SpringMVC中的異常處理機(jī)制

    本篇文章將為大家詳細(xì)介紹一下springmvc的異常處理機(jī)制,用到了ControllerAdvice和ExceptionHandler注解,感興趣的小伙伴可以了解一下
    2022-07-07
  • Maven的生命周期與自定義插件實(shí)現(xiàn)方法

    Maven的生命周期與自定義插件實(shí)現(xiàn)方法

    Maven的生命周期就是對(duì)所有的構(gòu)建過(guò)程進(jìn)行抽象和統(tǒng)一。包含了項(xiàng)目的清理、初始化、編譯、測(cè)試、打包、集成測(cè)試、驗(yàn)證、部署和站點(diǎn)生成等幾乎所有的構(gòu)建步驟
    2022-12-12
  • 淺析java實(shí)現(xiàn)數(shù)據(jù)加密問(wèn)題

    淺析java實(shí)現(xiàn)數(shù)據(jù)加密問(wèn)題

    本文通過(guò)實(shí)例代碼給大家介紹了java實(shí)現(xiàn)數(shù)據(jù)加密問(wèn)題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2019-11-11
  • 深入講解spring boot中servlet的啟動(dòng)過(guò)程與原理

    深入講解spring boot中servlet的啟動(dòng)過(guò)程與原理

    這篇文章主要給大家介紹了關(guān)于spring boot中servlet啟動(dòng)過(guò)程與原理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • Java泛型的簡(jiǎn)單實(shí)例

    Java泛型的簡(jiǎn)單實(shí)例

    這篇文章介紹了Java泛型的簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下
    2013-10-10
  • 通過(guò)實(shí)例了解cookie機(jī)制特性及使用方法

    通過(guò)實(shí)例了解cookie機(jī)制特性及使用方法

    這篇文章主要介紹了通過(guò)實(shí)例了解cookie機(jī)制特性及使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java中的javaBean、vo、entity、domain和pojo

    Java中的javaBean、vo、entity、domain和pojo

    這篇文章主要介紹了Java中的javaBean、vo、entity、domain和pojo用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java中import導(dǎo)入的用法說(shuō)明

    Java中import導(dǎo)入的用法說(shuō)明

    這篇文章主要介紹了Java中import導(dǎo)入的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java源碼解析LinkedList

    Java源碼解析LinkedList

    今天小編就為大家分享一篇關(guān)于Java源碼解析LinkedList,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01

最新評(píng)論