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

spring boot整合Shiro實(shí)現(xiàn)單點(diǎn)登錄的示例代碼

 更新時(shí)間:2018年01月26日 15:54:05   作者:牛奮lch  
本篇文章主要介紹了spring boot整合Shiro實(shí)現(xiàn)單點(diǎn)登錄的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

Shiro是什么

Shiro是一個(gè)Java平臺(tái)的開(kāi)源權(quán)限框架,用于認(rèn)證和訪問(wèn)授權(quán)。具體來(lái)說(shuō),滿(mǎn)足對(duì)如下元素的支持:

  1. 用戶(hù),角色,權(quán)限(僅僅是操作權(quán)限,數(shù)據(jù)權(quán)限必須與業(yè)務(wù)需求緊密結(jié)合),資源(url)。
  2. 用戶(hù)分配角色,角色定義權(quán)限。
  3. 訪問(wèn)授權(quán)時(shí)支持角色或者權(quán)限,并且支持多級(jí)的權(quán)限定義。

Q:對(duì)組的支持?
A:shiro默認(rèn)不支持對(duì)組設(shè)置權(quán)限。

Q:是否可以滿(mǎn)足對(duì)組進(jìn)行角色分配的需求?
A:擴(kuò)展Realm,可以支持對(duì)組進(jìn)行分配角色,其實(shí)就是給該組下的所有用戶(hù)分配權(quán)限。

Q:對(duì)數(shù)據(jù)權(quán)限的支持? 在業(yè)務(wù)系統(tǒng)中定義?
A:shiro僅僅實(shí)現(xiàn)對(duì)操作權(quán)限的控制,用于在前端控制元素隱藏或者顯示,以及對(duì)資源訪問(wèn)權(quán)限進(jìn)行檢查。數(shù)據(jù)權(quán)限與具體的業(yè)務(wù)需求緊密關(guān)聯(lián),shiro本身無(wú)法實(shí)現(xiàn)對(duì)數(shù)據(jù)權(quán)限的控制。

Q:動(dòng)態(tài)權(quán)限分配?
A:擴(kuò)展org.apache.shiro.realm.Realm,支持動(dòng)態(tài)權(quán)限分配。

Q:與Spring集成?
A:可以支持與Spring集成,shiro還支持jsp標(biāo)簽。

前面的博客中,我們說(shuō)道了Shiro的兩個(gè)最大的特點(diǎn),認(rèn)證和授權(quán),而單點(diǎn)登錄也是屬于認(rèn)證的一部分,默認(rèn)情況下,Shiro已經(jīng)為我們實(shí)現(xiàn)了和Cas的集成,我們加入集成的一些配置就ok了。

1、加入shiro-cas包

<!-- shiro整合cas單點(diǎn) --> 
    <dependency> 
      <groupId>org.apache.shiro</groupId> 
      <artifactId>shiro-cas</artifactId> 
      <version>1.2.4</version> 
    </dependency> 

2、加入單點(diǎn)登錄的配置

這里,我將所有的配置都貼出來(lái),方便參考,配置里面已經(jīng)加了詳盡的說(shuō)明。

package com.chhliu.springboot.shiro.config;  
import java.util.LinkedHashMap; 
import java.util.Map; 
import javax.servlet.Filter; 
import org.apache.shiro.cache.ehcache.EhCacheManager; 
import org.apache.shiro.cas.CasFilter; 
import org.apache.shiro.cas.CasSubjectFactory; 
import org.apache.shiro.spring.LifecycleBeanPostProcessor; 
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; 
import org.apache.shiro.spring.web.ShiroFilterFactoryBean; 
import org.apache.shiro.web.mgt.DefaultWebSecurityManager; 
import org.jasig.cas.client.session.SingleSignOutFilter; 
import org.jasig.cas.client.session.SingleSignOutHttpSessionListener; 
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; 
import org.springframework.boot.web.servlet.FilterRegistrationBean; 
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.DependsOn; 
import org.springframework.core.Ordered; 
import org.springframework.core.annotation.Order; 
import org.springframework.web.filter.DelegatingFilterProxy; 
 
/** 
 * Shiro 配置 
 * 
 * Apache Shiro 核心通過(guò) Filter 來(lái)實(shí)現(xiàn),就好像SpringMvc 通過(guò)DispachServlet 來(lái)主控制一樣。 既然是使用 
 * Filter 一般也就能猜到,是通過(guò)URL規(guī)則來(lái)進(jìn)行過(guò)濾和權(quán)限校驗(yàn),所以我們需要定義一系列關(guān)于URL的規(guī)則和訪問(wèn)權(quán)限。 
 * 
 * @author chhliu 
 */ 
@Configuration 
public class ShiroConfiguration { 
   
  // cas server地址 
  public static final String casServerUrlPrefix = "http://127.0.0.1"; 
  // Cas登錄頁(yè)面地址 
  public static final String casLoginUrl = casServerUrlPrefix + "/login"; 
  // Cas登出頁(yè)面地址 
  public static final String casLogoutUrl = casServerUrlPrefix + "/logout"; 
  // 當(dāng)前工程對(duì)外提供的服務(wù)地址 
  public static final String shiroServerUrlPrefix = "http://127.0.1.28:8080"; 
  // casFilter UrlPattern 
  public static final String casFilterUrlPattern = "/index"; 
  // 登錄地址 
  public static final String loginUrl = casLoginUrl + "?service=" + shiroServerUrlPrefix + casFilterUrlPattern; 
  // 登出地址(casserver啟用service跳轉(zhuǎn)功能,需在webapps\cas\WEB-INF\cas.properties文件中啟用cas.logout.followServiceRedirects=true) 
  public static final String logoutUrl = casLogoutUrl+"?service="+loginUrl; 
  // 登錄成功地址 
//  public static final String loginSuccessUrl = "/index"; 
  // 權(quán)限認(rèn)證失敗跳轉(zhuǎn)地址 
  public static final String unauthorizedUrl = "/error/403.html"; 
   
  /** 
   * 實(shí)例化SecurityManager,該類(lèi)是shiro的核心類(lèi) 
   * @return 
   */ 
  @Bean 
  public DefaultWebSecurityManager securityManager() { 
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); 
    securityManager.setRealm(myShiroCasRealm()); 
//   <!-- 用戶(hù)授權(quán)/認(rèn)證信息Cache, 采用EhCache 緩存 --> 
    securityManager.setCacheManager(getEhCacheManager()); 
    // 指定 SubjectFactory,如果要實(shí)現(xiàn)cas的remember me的功能,需要用到下面這個(gè)CasSubjectFactory,并設(shè)置到securityManager的subjectFactory中 
    securityManager.setSubjectFactory(new CasSubjectFactory()); 
    return securityManager; 
  } 
 
  /** 
   * 配置緩存 
   * @return 
   */ 
  @Bean 
  public EhCacheManager getEhCacheManager() { 
    EhCacheManager em = new EhCacheManager(); 
    em.setCacheManagerConfigFile("classpath:config/ehcache-shiro.xml"); 
    return em; 
  } 
 
  /** 
   * 配置Realm,由于我們使用的是CasRealm,所以已經(jīng)集成了單點(diǎn)登錄的功能 
   * @param cacheManager 
   * @return 
   */ 
  @Bean 
  public MyShiroRealm myShiroCasRealm() { 
    MyShiroRealm realm = new MyShiroRealm(); 
    // cas登錄服務(wù)器地址前綴 
    realm.setCasServerUrlPrefix(ShiroConfiguration.casServerUrlPrefix); 
    // 客戶(hù)端回調(diào)地址,登錄成功后的跳轉(zhuǎn)地址(自己的服務(wù)地址) 
    realm.setCasService(ShiroConfiguration.shiroServerUrlPrefix + ShiroConfiguration.casFilterUrlPattern); 
    // 登錄成功后的默認(rèn)角色,此處默認(rèn)為user角色 
    realm.setDefaultRoles("user"); 
    return realm; 
  } 
 
  /** 
   * 注冊(cè)單點(diǎn)登出的listener 
   * @return 
   */ 
  @SuppressWarnings({ "rawtypes", "unchecked" }) 
  @Bean 
  @Order(Ordered.HIGHEST_PRECEDENCE)// 優(yōu)先級(jí)需要高于Cas的Filter 
  public ServletListenerRegistrationBean<?> singleSignOutHttpSessionListener(){ 
    ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean(); 
    bean.setListener(new SingleSignOutHttpSessionListener()); 
    bean.setEnabled(true); 
    return bean; 
  } 
 
  /** 
   * 注冊(cè)單點(diǎn)登出filter 
   * @return 
   */ 
  @Bean 
  public FilterRegistrationBean singleSignOutFilter(){ 
    FilterRegistrationBean bean = new FilterRegistrationBean(); 
    bean.setName("singleSignOutFilter"); 
    bean.setFilter(new SingleSignOutFilter()); 
    bean.addUrlPatterns("/*"); 
    bean.setEnabled(true); 
    return bean; 
  } 
 
  /** 
   * 注冊(cè)DelegatingFilterProxy(Shiro) 
   */ 
  @Bean 
  public FilterRegistrationBean delegatingFilterProxy() { 
    FilterRegistrationBean filterRegistration = new FilterRegistrationBean(); 
    filterRegistration.setFilter(new DelegatingFilterProxy("shiroFilter")); 
    // 該值缺省為false,表示生命周期由SpringApplicationContext管理,設(shè)置為true則表示由ServletContainer管理 
    filterRegistration.addInitParameter("targetFilterLifecycle", "true"); 
    filterRegistration.setEnabled(true); 
    filterRegistration.addUrlPatterns("/*"); 
    return filterRegistration; 
  } 
 
  /** 
   * 該類(lèi)可以保證實(shí)現(xiàn)了org.apache.shiro.util.Initializable接口的shiro對(duì)象的init或者是destory方法被自動(dòng)調(diào)用, 
   * 而不用手動(dòng)指定init-method或者是destory-method方法 
   * 注意:如果使用了該類(lèi),則不需要手動(dòng)指定初始化方法和銷(xiāo)毀方法,否則會(huì)出錯(cuò) 
   * @return 
   */ 
  @Bean(name = "lifecycleBeanPostProcessor") 
  public LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() { 
    return new LifecycleBeanPostProcessor(); 
  } 
 
  /** 
   * 下面兩個(gè)配置主要用來(lái)開(kāi)啟shiro aop注解支持. 使用代理方式;所以需要開(kāi)啟代碼支持; 
   * @return 
   */ 
  @Bean 
  @DependsOn("lifecycleBeanPostProcessor") 
  public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() { 
    DefaultAdvisorAutoProxyCreator daap = new DefaultAdvisorAutoProxyCreator(); 
    daap.setProxyTargetClass(true); 
    return daap; 
  } 
   
  /** 
   * @param securityManager 
   * @return 
   */ 
  @Bean 
  public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) { 
    AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); 
    authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); 
    return authorizationAttributeSourceAdvisor; 
  } 
 
  /** 
   * CAS過(guò)濾器 
   * @return 
   */ 
  @Bean(name = "casFilter") 
  public CasFilter getCasFilter() { 
    CasFilter casFilter = new CasFilter(); 
    casFilter.setName("casFilter"); 
    casFilter.setEnabled(true); 
    // 登錄失敗后跳轉(zhuǎn)的URL,也就是 Shiro 執(zhí)行 CasRealm 的 doGetAuthenticationInfo 方法向CasServer驗(yàn)證tiket 
    casFilter.setFailureUrl(loginUrl);// 我們選擇認(rèn)證失敗后再打開(kāi)登錄頁(yè)面 
    casFilter.setLoginUrl(loginUrl); 
    return casFilter; 
  } 
 
  /** 
   * 使用工廠模式,創(chuàng)建并初始化ShiroFilter 
   * @param securityManager 
   * @param casFilter 
   * @return 
   */ 
  @Bean(name = "shiroFilter") 
  public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager securityManager, CasFilter casFilter) { 
    ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); 
    // 必須設(shè)置 SecurityManager 
    shiroFilterFactoryBean.setSecurityManager(securityManager); 
    // 如果不設(shè)置默認(rèn)會(huì)自動(dòng)尋找Web工程根目錄下的"/login.jsp"頁(yè)面 
    shiroFilterFactoryBean.setLoginUrl(loginUrl); 
    /* 
     * 登錄成功后要跳轉(zhuǎn)的連接,不設(shè)置的時(shí)候,會(huì)默認(rèn)跳轉(zhuǎn)到前一步的url 
     * 比如先在瀏覽器中輸入了http://localhost:8080/userlist,但是現(xiàn)在用戶(hù)卻沒(méi)有登錄,于是會(huì)跳轉(zhuǎn)到登錄頁(yè)面,等登錄認(rèn)證通過(guò)后, 
     * 頁(yè)面會(huì)再次自動(dòng)跳轉(zhuǎn)到http://localhost:8080/userlist頁(yè)面而不是登錄成功后的index頁(yè)面 
     * 建議不要設(shè)置這個(gè)字段 
     */ 
//    shiroFilterFactoryBean.setSuccessUrl(loginSuccessUrl); 
     
    // 設(shè)置無(wú)權(quán)限訪問(wèn)頁(yè)面 
    shiroFilterFactoryBean.setUnauthorizedUrl(unauthorizedUrl); 
    /* 
     * 添加casFilter到shiroFilter中,注意,casFilter需要放到shiroFilter的前面, 
     * 從而保證程序在進(jìn)入shiro的login登錄之前就會(huì)進(jìn)入單點(diǎn)認(rèn)證 
     */ 
    Map<String, Filter> filters = new LinkedHashMap<>(); 
    filters.put("casFilter", casFilter); 
     
    // logout已經(jīng)被單點(diǎn)登錄的logout取代 
    // filters.put("logout",logoutFilter()); 
    shiroFilterFactoryBean.setFilters(filters); 
 
    loadShiroFilterChain(shiroFilterFactoryBean); 
    return shiroFilterFactoryBean; 
  } 
 
  /** 
   * 加載shiroFilter權(quán)限控制規(guī)則(從數(shù)據(jù)庫(kù)讀取然后配置),角色/權(quán)限信息由MyShiroCasRealm對(duì)象提供doGetAuthorizationInfo實(shí)現(xiàn)獲取來(lái)的 
   * 生產(chǎn)中會(huì)將這部分規(guī)則放到數(shù)據(jù)庫(kù)中 
   * @param shiroFilterFactoryBean 
   */ 
  private void loadShiroFilterChain(ShiroFilterFactoryBean shiroFilterFactoryBean){ 
    /////////////////////// 下面這些規(guī)則配置最好配置到配置文件中,注意,此處加入的filter需要保證有序,所以用的LinkedHashMap /////////////////////// 
    Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();  
    filterChainDefinitionMap.put(casFilterUrlPattern, "casFilter");  
    //2.不攔截的請(qǐng)求 
    filterChainDefinitionMap.put("/css/**","anon"); 
    filterChainDefinitionMap.put("/js/**","anon"); 
    filterChainDefinitionMap.put("/login", "anon"); 
    // 此處將logout頁(yè)面設(shè)置為anon,而不是logout,因?yàn)閘ogout被單點(diǎn)處理,而不需要再被shiro的logoutFilter進(jìn)行攔截 
    filterChainDefinitionMap.put("/logout","anon"); 
    filterChainDefinitionMap.put("/error","anon"); 
    //3.攔截的請(qǐng)求(從本地?cái)?shù)據(jù)庫(kù)獲取或者從casserver獲取(webservice,http等遠(yuǎn)程方式),看你的角色權(quán)限配置在哪里) 
    filterChainDefinitionMap.put("/user", "authc"); //需要登錄 
    //4.登錄過(guò)的不攔截 
    filterChainDefinitionMap.put("/**", "authc"); 
    shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); 
  } 
} 

部分配置參考:http://shiro.apache.org/spring.html

3、編寫(xiě)Realm

由于需要集成單點(diǎn)登錄的功能,所以需要集成CasRealm類(lèi),該類(lèi)已經(jīng)為我們實(shí)現(xiàn)了單點(diǎn)認(rèn)證的功能,我們要做的就是實(shí)現(xiàn)授權(quán)部分的功能,示例代碼如下:

package com.chhliu.springboot.shiro.config;  
import javax.annotation.Resource;  
import org.apache.shiro.SecurityUtils; 
import org.apache.shiro.authc.AuthenticationInfo; 
import org.apache.shiro.authc.AuthenticationToken; 
import org.apache.shiro.authz.AuthorizationInfo; 
import org.apache.shiro.authz.SimpleAuthorizationInfo; 
import org.apache.shiro.cas.CasRealm; 
import org.apache.shiro.subject.PrincipalCollection; 
 
import com.chhliu.springboot.shiro.mode.SysPermission; 
import com.chhliu.springboot.shiro.mode.SysRole; 
import com.chhliu.springboot.shiro.mode.UserInfo; 
import com.chhliu.springboot.shiro.service.UserInfoService; 
 
/** 
 * 權(quán)限校驗(yàn)核心類(lèi); 由于使用了單點(diǎn)登錄,所以無(wú)需再進(jìn)行身份認(rèn)證 只需要授權(quán)即可 
 * 
 * @author chhliu 
 */ 
public class MyShiroRealm extends CasRealm { 
 
  @Resource 
  private UserInfoService userInfoService; 
 
  /** 
   * 1、CAS認(rèn)證 ,驗(yàn)證用戶(hù)身份 
   * 2、將用戶(hù)基本信息設(shè)置到會(huì)話(huà)中,方便獲取 
   * 3、該方法可以直接使用CasRealm中的認(rèn)證方法,此處僅用作測(cè)試 
   */ 
  @Override 
  protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) { 
 
    // 調(diào)用父類(lèi)中的認(rèn)證方法,CasRealm已經(jīng)為我們實(shí)現(xiàn)了單點(diǎn)認(rèn)證。 
    AuthenticationInfo authc = super.doGetAuthenticationInfo(token); 
 
    // 獲取登錄的賬號(hào),cas認(rèn)證成功后,會(huì)將賬號(hào)存起來(lái) 
    String account = (String) authc.getPrincipals().getPrimaryPrincipal(); 
 
    // 將用戶(hù)信息存入session中,方便程序獲取,此處可以將根據(jù)登錄賬號(hào)查詢(xún)出的用戶(hù)信息放到session中 
    SecurityUtils.getSubject().getSession().setAttribute("no", account); 
 
    return authc; 
  } 
 
  /** 
   * 此方法調(diào)用 hasRole,hasPermission的時(shí)候才會(huì)進(jìn)行回調(diào). 
   * 
   * 權(quán)限信息.(授權(quán)): 1、如果用戶(hù)正常退出,緩存自動(dòng)清空; 2、如果用戶(hù)非正常退出,緩存自動(dòng)清空; 
   * 3、如果我們修改了用戶(hù)的權(quán)限,而用戶(hù)不退出系統(tǒng),修改的權(quán)限無(wú)法立即生效。 (需要手動(dòng)編程進(jìn)行實(shí)現(xiàn);放在service進(jìn)行調(diào)用) 
   * 在權(quán)限修改后調(diào)用realm中的方法,realm已經(jīng)由spring管理,所以從spring中獲取realm實(shí)例, 調(diào)用clearCached方法; 
   * :Authorization 是授權(quán)訪問(wèn)控制,用于對(duì)用戶(hù)進(jìn)行的操作授權(quán),證明該用戶(hù)是否允許進(jìn)行當(dāng)前操作,如訪問(wèn)某個(gè)鏈接,某個(gè)資源文件等。 
   * 
   * @param principals 
   * @return 
   */ 
  @Override 
  protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { 
    System.out.println("權(quán)限配置-->MyShiroRealm.doGetAuthorizationInfo()"); 
 
    SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); 
    // 獲取單點(diǎn)登陸后的用戶(hù)名,也可以從session中獲取,因?yàn)樵谡J(rèn)證成功后,已經(jīng)將用戶(hù)名放到session中去了 
    String userName = (String) super.getAvailablePrincipal(principals); 
//       principals.getPrimaryPrincipal(); 這種方式也可以獲取用戶(hù)名 
 
    // 根據(jù)用戶(hù)名獲取該用戶(hù)的角色和權(quán)限信息 
    UserInfo userInfo = userInfoService.findByUsername(userName); 
 
    // 將用戶(hù)對(duì)應(yīng)的角色和權(quán)限信息打包放到AuthorizationInfo中 
    for (SysRole role : userInfo.getRoleList()) { 
      authorizationInfo.addRole(role.getRole()); 
      for (SysPermission p : role.getPermissions()) { 
        authorizationInfo.addStringPermission(p.getPermission()); 
      } 
    } 
 
    return authorizationInfo; 
  } 
} 

下面,我們就可以進(jìn)行驗(yàn)證測(cè)試了!

在瀏覽器輸入http:127.0.1.28:8080/userInfo/userList 我們會(huì)發(fā)現(xiàn),會(huì)自動(dòng)跳轉(zhuǎn)到單點(diǎn)的登錄頁(yè)面

然后我們輸入用戶(hù)名和密碼,就會(huì)自動(dòng)跳轉(zhuǎn)到http:127.0.1.28:8080/userInfo/userList頁(yè)面了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • AspectJ的基本用法

    AspectJ的基本用法

    本文主要介紹了AspectJ的基本用法。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-04-04
  • Java的泛型擦除和運(yùn)行時(shí)泛型信息獲取方式

    Java的泛型擦除和運(yùn)行時(shí)泛型信息獲取方式

    Java泛型在編譯時(shí)會(huì)發(fā)生類(lèi)型擦除,即泛型參數(shù)被替換為它們的限定類(lèi)型(如Object),這使得ArrayList<Integer>和ArrayList<String>在運(yùn)行時(shí)類(lèi)型相同,盡管如此,我們可以通過(guò)定義類(lèi)或匿名內(nèi)部類(lèi)的方式在運(yùn)行時(shí)獲取泛型信息
    2024-09-09
  • Spring Boot整合Spring Cache及Redis過(guò)程解析

    Spring Boot整合Spring Cache及Redis過(guò)程解析

    這篇文章主要介紹了Spring Boot整合Spring Cache及Redis過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • JAVA使用前綴樹(shù)(Tire樹(shù))實(shí)現(xiàn)敏感詞過(guò)濾、詞典搜索

    JAVA使用前綴樹(shù)(Tire樹(shù))實(shí)現(xiàn)敏感詞過(guò)濾、詞典搜索

    本文主要介紹了JAVA使用前綴樹(shù)(Tire樹(shù))實(shí)現(xiàn)敏感詞過(guò)濾、詞典搜索,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Java Socket設(shè)置timeout的幾種常用方式說(shuō)明

    Java Socket設(shè)置timeout的幾種常用方式說(shuō)明

    這篇文章主要介紹了Java Socket設(shè)置timeout的幾種常用方式說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Java拆裝箱深度剖析

    Java拆裝箱深度剖析

    這篇文章主要為大家深度剖析了Java拆箱裝箱的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Spring Boot如何使用Spring Security進(jìn)行安全控制

    Spring Boot如何使用Spring Security進(jìn)行安全控制

    要實(shí)現(xiàn)訪問(wèn)控制的方法多種多樣,可以通過(guò)Aop、攔截器實(shí)現(xiàn),也可以通過(guò)框架實(shí)現(xiàn),本文將具體介紹在Spring Boot中如何使用Spring Security進(jìn)行安全控制。
    2017-04-04
  • 解決spring 處理request.getInputStream()輸入流只能讀取一次問(wèn)題

    解決spring 處理request.getInputStream()輸入流只能讀取一次問(wèn)題

    這篇文章主要介紹了解決spring 處理request.getInputStream()輸入流只能讀取一次問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Maven中Junit測(cè)試@Test等注解無(wú)法識(shí)別的問(wèn)題及解決

    Maven中Junit測(cè)試@Test等注解無(wú)法識(shí)別的問(wèn)題及解決

    這篇文章主要介紹了Maven中Junit測(cè)試@Test等注解無(wú)法識(shí)別的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • SpringBoot使用CXF集成WebService的方法

    SpringBoot使用CXF集成WebService的方法

    這篇文章主要介紹了SpringBoot使用CXF集成WebService的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評(píng)論