最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot集成CAS實(shí)現(xiàn)單點(diǎn)登錄的示例代碼

 更新時(shí)間:2020年06月22日 10:05:58   作者:Mshu  
這篇文章主要介紹了springboot集成CAS實(shí)現(xiàn)單點(diǎn)登錄的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

最近新參與的項(xiàng)目用到了cas單點(diǎn)登錄,我還不會(huì),這怎么能容忍!空了學(xué)習(xí)并搭建了一個(gè)spring-boot 集成CAS 的demo。實(shí)現(xiàn)了單點(diǎn)登錄與登出。

單點(diǎn)登錄英文全稱是:Single Sign On,簡(jiǎn)稱SSO。
含義:在多個(gè)相互信任的系統(tǒng)中,只要登錄一個(gè)系統(tǒng)其他系統(tǒng)均可訪問(wèn)。

CAS 是一種使用廣泛的單點(diǎn)登錄實(shí)現(xiàn),分為客戶端CAS Client和服務(wù)端 CAS Service,客戶端就是我們的系統(tǒng),服務(wù)端是認(rèn)證中心,由CAS提供,我們需要稍作修改,啟動(dòng)起來(lái)就可以用。~~~~

效果演示

https證書

CAS Service 需要用https的方式,那么就需要證書,可以買也可以自己生成一個(gè)。
其實(shí)這一步也可以省略,訪問(wèn)的時(shí)候使用http即可,只是cas 會(huì)給警告。

步驟和把大象裝進(jìn)冰箱一樣簡(jiǎn)單,總共三步:

  • 生成密鑰
  • 生成證書
  • 導(dǎo)入證書

1. 生成密鑰

keytool -genkey -alias cainiao -keyalg RSA -keystore E:sslcainiao.keystore

參數(shù)說(shuō)明:

  • -genkey 生成密鑰
  • -keyalg 指定密鑰算法,這時(shí)指定RSA
  • -alias 指定別名
  • -keystore 指定密鑰庫(kù)存儲(chǔ)位置,這里存在 E:/ssl/目錄下

在執(zhí)行中會(huì)問(wèn)你很多問(wèn)題,當(dāng)問(wèn)到 :您的名字與姓氏是什么?
此時(shí)需要填寫域名,作為之后的訪問(wèn)地址,其他隨意。
執(zhí)行完后生成一個(gè)密鑰文件 cainiao.keystore

2. 生成證書

keytool -export -alias cainiao -storepass 123456 -file E:/ssl/cainiao.cer -keystore E:/ssl/cainiao.keystore

參數(shù)說(shuō)明:

-storepass 剛剛生成密鑰文件時(shí)候的設(shè)置的密碼
-file指定導(dǎo)出證書的文件名為cainiao.cer
-keystore指定之前生成的密鑰文件的文件名

執(zhí)行完后目錄下會(huì)生成一個(gè)cainiao.cer證書

3. 導(dǎo)入證書

keytool -import -alias cainiao -keystore C:/"Program Files"/Java/jdk1.8.0_181/jre/lib/security/cacerts -file E:/ssl/cainiao.cer -trustcacerts

將證書導(dǎo)入到JDK信任庫(kù)
把原來(lái)的$JAVA_HOME/jre/lib/security/cacerts文件要先刪掉,否則會(huì)報(bào)出 Keystore was tampered with, or password was incorrect.

下面是整個(gè)過(guò)程:

PS E:\ssl> keytool -genkey -alias cainiao -keyalg RSA -keystore E:\ssl\cainiao.keystore
輸入密鑰庫(kù)口令:
再次輸入新口令:
您的名字與姓氏是什么?
 [Unknown]: www.cainiao.com
您的組織單位名稱是什么?
 [Unknown]: cainian
您的組織名稱是什么?
 [Unknown]: cainiao
您所在的城市或區(qū)域名稱是什么?
 [Unknown]: wx
您所在的省/市/自治區(qū)名稱是什么?
 [Unknown]: js
該單位的雙字母國(guó)家/地區(qū)代碼是什么?
 [Unknown]: CN
CN=www.cainiao.com, OU=cainian, O=cainiao, L=wx, ST=js, C=CN是否正確?
 [否]: y

輸入 <cainiao> 的密鑰口令
  (如果和密鑰庫(kù)口令相同, 按回車):
再次輸入新口令:

------------------------------------------------------------------------------------

PS E:\ssl> keytool -export -alias cainiao -storepass 123456 -file E:/ssl/cainiao.cer -keystore E:/ssl/cainiao.keystore
存儲(chǔ)在文件 <E:/ssl/cainiao.cer> 中的證書

------------------------------------------------------------------------------------

PS E:\ssl> keytool -import -alias cainiao -keystore C:/"Program Files"/Java/jdk1.8.0_181/jre/lib/security/cacerts -file E:/ssl/cainiao.cer -trustcacerts
輸入密鑰庫(kù)口令:
所有者: CN=www.cainiao.com, OU=cainian, O=cainiao, L=wx, ST=js, C=CN
發(fā)布者: CN=www.cainiao.com, OU=cainian, O=cainiao, L=wx, ST=js, C=CN
序列號(hào): 509d1aea
有效期為 Wed Jun 17 22:02:55 CST 2020 至 Tue Sep 15 22:02:55 CST 2020
證書指紋:
   MD5: 5B:B2:7C:D7:B7:31:C5:7C:1C:BC:F7:DA:A8:2D:1C:B2
   SHA1: F6:76:55:55:D7:48:E3:9F:3A:B6:EE:68:1F:BE:DC:DE:51:B1:33:E5
   SHA256: 24:53:18:CD:E8:95:65:D8:6E:6A:7B:8E:79:CB:91:BD:F4:2E:C3:99:59:D1:76:12:A8:95:45:2A:4B:03:E4:AD
簽名算法名稱: SHA256withRSA
主體公共密鑰算法: 2048 位 RSA 密鑰
版本: 3

擴(kuò)展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 70 B3 D5 76 36 EA 54 BA 75 C1 A1 5C DA 76 82 0E p..v6.T.u..\.v..
0010: 4D F4 C9 05          M...
]
]

是否信任此證書? [否]: y
證書已添加到密鑰庫(kù)中

最后,hosts 配置 127.0.0.1 www.cainiao.com

搭建CAS service

需要從github上拉取模板 https://github.com/apereo/cas-overlay-template
5.3之后的都是gradle項(xiàng)目,5.3以之前都是maven 項(xiàng)目,我下載5.3版本的。

1.> 把pom 里面的<repositories>倉(cāng)庫(kù)地址去掉,國(guó)外的倉(cāng)庫(kù)地址比較慢。你懂得。
2.> 在根目錄下建/src/main/resources目錄
3.> 將生成的密鑰文件復(fù)制到/src/main/resources目錄下
4.> 將overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.14/WEB-INF/classes/application.properties文件復(fù)制到第二步建的目錄下。
5.> 修改復(fù)制過(guò)來(lái)的/src/main/resources/application.properties文件,根據(jù)上面的證書信息如實(shí)填寫。

server.ssl.key-store=classpath:cainiao.keystore
server.ssl.key-store-password=123456
server.ssl.key-password=123456

6.> 連接mysql數(shù)據(jù)庫(kù),在pom 中添加依賴

<dependency>
  <groupId>org.apereo.cas</groupId>
  <artifactId>cas-server-support-jdbc</artifactId>
  <version>${cas.version}</version>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.21</version>
</dependency>

或許你會(huì)發(fā)現(xiàn)有個(gè)xmlsectool-2.0.0.jar包下不下來(lái),這是阿里云的倉(cāng)庫(kù)沒(méi)有,需要到maven中央倉(cāng)庫(kù)下載,后安裝到本地倉(cāng)庫(kù),可不是直接放到本地倉(cāng)庫(kù),jar包都是必須使用命令安裝到本地倉(cāng)庫(kù)。

mvn install:install-file -Dfile="E:下載xmlsectool-2.0.0.jar" "-DgroupId=net.shibboleth.tool" "-DartifactId=xmlsectool" "-Dversion=2.0.0" "-Dpackaging=jar"

安裝jar包到本地倉(cāng)庫(kù)筆記

7.> 在復(fù)制過(guò)來(lái)的/src/main/resources/application.properties文件中在添加如下信息

#查詢賬號(hào)密碼sql,必須包含密碼字段
cas.authn.jdbc.query[0].sql=select * from sys_user where username=?
#指定上面的sql查詢字段名(必須)
cas.authn.jdbc.query[0].fieldPassword=password
#指定過(guò)期字段,1為過(guò)期,若過(guò)期需要修改密碼
cas.authn.jdbc.query[0].fieldExpired=expired
#為不可用字段段,1為不可用,
cas.authn.jdbc.query[0].fieldDisabled=disabled
#數(shù)據(jù)庫(kù)方言hibernate的知識(shí)
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect
#數(shù)據(jù)庫(kù)驅(qū)動(dòng)
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
#數(shù)據(jù)庫(kù)連接 
cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/cas?useUnicode=true&characterEncoding=UTF-8
#數(shù)據(jù)庫(kù)用戶名
cas.authn.jdbc.query[0].user=root
#數(shù)據(jù)庫(kù)密碼
cas.authn.jdbc.query[0].password=123456
#默認(rèn)加密策略,通過(guò)encodingAlgorithm來(lái)指定算法,默認(rèn)NONE不加密
cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8
cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5

附上數(shù)據(jù)庫(kù)sql,用戶信息表

-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `username` varchar(255) DEFAULT NULL,
 `password` varchar(255) DEFAULT NULL,
 `expired` int(11) DEFAULT NULL,
 `disabled` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of sys_user
-- ----------------------------
INSERT INTO `sys_user` VALUES ('1', 'admin', '21232f297a57a5a743894a0e4a801fc3', '0', '1');
INSERT INTO `sys_user` VALUES ('2', 'cainiao', '6b757206058785025cd90c8d865c8e43', '1', '0');
INSERT INTO `sys_user` VALUES ('3', 'mashu', 'd1f21ceb3f710ebbd9f408274aee1193', '0', '0');

用戶名和密碼一樣,密碼在數(shù)據(jù)庫(kù)中是MD5加密的。
這樣就完成了CAS service 的搭建,在根目錄使用 build.cmd run 命令啟動(dòng)
出現(xiàn) READY 的branner就啟動(dòng)好了 訪問(wèn)地址 https://www.cainiao.com:8443/cas/login

mashu正常登錄,cainiao需要修改密碼,admin被禁用,符合預(yù)期。

搭建CAS client

創(chuàng)建一個(gè)spring boot 項(xiàng)目.
1.加入cas 客戶端 的依賴, 我選擇目前最新的 2.3.0-GA 版本

<dependency>
 <groupId>net.unicon.cas</groupId>
 <artifactId>cas-client-autoconfig-support</artifactId>
 <version>2.3.0-GA</version>  
</dependency>

2.在啟動(dòng)類上加上注解 @EnableCasClient
3.在application.properties中添加配置

#cas服務(wù)端的地址
cas.server-url-prefix=https://www.cainiao.com:8443/cas
#cas服務(wù)端的登錄地址
cas.server-login-url=https://www.cainiao.com:8443/cas/login
#客戶端訪問(wèn)地址
cas.client-host-url=http://www.mashu.com:8080
cas.validation-type=CAS3

4.添加hosts 配置,把客戶端的訪問(wèn)地址配置到hosts

127.0.0.1 www.mashu.com

這樣就客戶端就配置好了。

單點(diǎn)登錄

我寫一個(gè)controller,訪問(wèn)一下。

@RestController
public class TestController {

 @RequestMapping("/hello")
 public String hello() {
  return "word";
 }
}

訪問(wèn) http://www.mashu.com:8080/hello

未認(rèn)證授權(quán)的服務(wù)

喜提報(bào)錯(cuò):

原因是服務(wù)端不允許客戶端的http協(xié)議的請(qǐng)求。需要對(duì)服務(wù)端做以下修改,讓他妥協(xié)。
1.>修改overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.14/WEB-INF/classes/services/HTTPSandIMAPS-10000001.json文件

"serviceId" 由原來(lái)的"^(https|imaps)://.*"改成 "^(https|imaps|http)://.*"

2.>在application.properties文件中添加:

#允許http
cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true

再次訪問(wèn) http://www.mashu.com:8080/hello,可以看到已經(jīng)帶著地址轉(zhuǎn)發(fā)到服務(wù)端的登錄頁(yè)。

輸入賬號(hào)密碼mashu/mashu,登錄成功后又回來(lái)了!哈哈哈哈嗝,并攜帶了登錄憑證。

多系統(tǒng)登錄

再啟動(dòng)一個(gè)客戶端,打開idea 的edit configurations設(shè)置。勾選 Allow parallel run

修改application.properties,服務(wù)的端口等信息,再點(diǎn)擊啟動(dòng),就可以同時(shí)啟動(dòng)了(8081/8080)兩個(gè)客戶端

server.port=8081
#cas服務(wù)端的地址
cas.server-url-prefix=https://www.cainiao.com:8443/cas
#cas服務(wù)端的登錄地址
cas.server-login-url=https://www.cainiao.com:8443/cas/login
#客戶端訪問(wèn)地址
cas.client-host-url=http://www.mshu.com:8081
cas.validation-type=CAS3

訪問(wèn)第二個(gè)客戶端 http://www.mshu.com:8081/hello,(需要先配置host),就直接登錄了,到此完成了單點(diǎn)登錄。

點(diǎn)單登出

添加兩個(gè)配置文件;

1. CasProperties.java

import org.springframework.boot.context.properties.ConfigurationProperties;
import javax.validation.constraints.NotNull;

@ConfigurationProperties(prefix = "cas",ignoreUnknownFields = true)
public class CasProperties {

 /**
  * CAS server URL E.g. https://example.com/cas or https://cas.example. Required.
  * CAS 服務(wù)端 url 不能為空
  */
 @NotNull
 private String serverUrlPrefix;

 /**
  * CAS server login URL E.g. https://example.com/cas/login or https://cas.example/login. Required.
  * CAS 服務(wù)端登錄地址 上面的連接 加上/login 該參數(shù)不能為空
  */
 @NotNull
 private String serverLoginUrl;

 /**
  * CAS-protected client application host URL E.g. https://myclient.example.com Required.
  * 當(dāng)前客戶端的地址
  */
 @NotNull
 private String clientHostUrl;

 /**
  * 忽略規(guī)則,訪問(wèn)那些地址 不需要登錄
  */
 private String ignorePattern;

 /**
  * 自定義UrlPatternMatcherStrategy驗(yàn)證
  */
 private String ignoreUrlPatternType;

 public String getServerUrlPrefix() {
  return serverUrlPrefix;
 }

 public void setServerUrlPrefix(String serverUrlPrefix) {
  this.serverUrlPrefix = serverUrlPrefix;
 }

 public String getServerLoginUrl() {
  return serverLoginUrl;
 }

 public void setServerLoginUrl(String serverLoginUrl) {
  this.serverLoginUrl = serverLoginUrl;
 }

 public String getClientHostUrl() {
  return clientHostUrl;
 }

 public void setClientHostUrl(String clientHostUrl) {
  this.clientHostUrl = clientHostUrl;
 }

 public String getIgnorePattern() {
  return ignorePattern;
 }

 public void setIgnorePattern(String ignorePattern) {
  this.ignorePattern = ignorePattern;
 }

 public String getIgnoreUrlPatternType() {
  return ignoreUrlPatternType;
 }

 public void setIgnoreUrlPatternType(String ignoreUrlPatternType) {
  this.ignoreUrlPatternType = ignoreUrlPatternType;
 }
}

2. Configs.java

import org.jasig.cas.client.authentication.AuthenticationFilter;
import org.jasig.cas.client.session.SingleSignOutFilter;
import org.jasig.cas.client.session.SingleSignOutHttpSessionListener;
import org.jasig.cas.client.util.HttpServletRequestWrapperFilter;
import org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
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 java.util.EventListener;
import java.util.HashMap;
import java.util.Map;

@Configuration
@EnableConfigurationProperties(CasProperties.class)
public class Configs {

 @Autowired
 private CasProperties configProps;

 /**
  * 配置登出過(guò)濾器
  * @return
  */
 @Bean
 public FilterRegistrationBean filterSingleRegistration() {
  final FilterRegistrationBean registration = new FilterRegistrationBean();
  registration.setFilter(new SingleSignOutFilter());
  // 設(shè)定匹配的路徑
  registration.addUrlPatterns("/*");
  Map<String,String> initParameters = new HashMap<String, String>();
  initParameters.put("casServerUrlPrefix", configProps.getServerUrlPrefix());
  registration.setInitParameters(initParameters);
  // 設(shè)定加載的順序
  registration.setOrder(1);
  return registration;
 }

 /**
  * 配置過(guò)濾驗(yàn)證器 這里用的是Cas30ProxyReceivingTicketValidationFilter
  * @return
  */
 @Bean
 public FilterRegistrationBean filterValidationRegistration() {
  final FilterRegistrationBean registration = new FilterRegistrationBean();
  registration.setFilter(new Cas30ProxyReceivingTicketValidationFilter());
  // 設(shè)定匹配的路徑
  registration.addUrlPatterns("/*");
  Map<String,String> initParameters = new HashMap<String, String>();
  initParameters.put("casServerUrlPrefix", configProps.getServerUrlPrefix());
  initParameters.put("serverName", configProps.getClientHostUrl());
  initParameters.put("useSession", "true");
  registration.setInitParameters(initParameters);
  // 設(shè)定加載的順序
  registration.setOrder(2);
  return registration;
 }

 /**
  * 配置授權(quán)過(guò)濾器
  * @return
  */
 @Bean
 public FilterRegistrationBean filterAuthenticationRegistration() {
  final FilterRegistrationBean registration = new FilterRegistrationBean();
  registration.setFilter(new AuthenticationFilter());
  // 設(shè)定匹配的路徑
  registration.addUrlPatterns("/*");
  Map<String,String> initParameters = new HashMap<String, String>();
  initParameters.put("casServerLoginUrl", configProps.getServerLoginUrl());
  initParameters.put("serverName", configProps.getClientHostUrl());

  if(configProps.getIgnorePattern() != null && !"".equals(configProps.getIgnorePattern())){
   initParameters.put("ignorePattern", configProps.getIgnorePattern());
  }

  //自定義UrlPatternMatcherStrategy 驗(yàn)證規(guī)則
  if(configProps.getIgnoreUrlPatternType() != null && !"".equals(configProps.getIgnoreUrlPatternType())){
   initParameters.put("ignoreUrlPatternType", configProps.getIgnoreUrlPatternType());
  }

  registration.setInitParameters(initParameters);
  // 設(shè)定加載的順序
  registration.setOrder(3);
  return registration;
 }

 /**
  * request wraper過(guò)濾器
  * @return
  */
 @Bean
 public FilterRegistrationBean filterWrapperRegistration() {
  final FilterRegistrationBean registration = new FilterRegistrationBean();
  registration.setFilter(new HttpServletRequestWrapperFilter());
  // 設(shè)定匹配的路徑
  registration.addUrlPatterns("/*");
  // 設(shè)定加載的順序
  registration.setOrder(4);
  return registration;
 }

 /**
  * 添加監(jiān)聽(tīng)器
  * @return
  */
 @Bean
 public ServletListenerRegistrationBean<EventListener> singleSignOutListenerRegistration(){
  ServletListenerRegistrationBean<EventListener> registrationBean = new ServletListenerRegistrationBean<EventListener>();
  registrationBean.setListener(new SingleSignOutHttpSessionListener());
  registrationBean.setOrder(1);
  return registrationBean;
 }
}

登出地址: https://www.cainiao.com:8443/cas/logout,退出服務(wù)端。
再次訪問(wèn)客戶端發(fā)現(xiàn)自動(dòng)跳到了登錄頁(yè)面,即客戶端也自動(dòng)退出成功。

一些問(wèn)題

最開始我想把客戶端也加一個(gè)證書,用https訪問(wèn)。免得在服務(wù)端做修改去支持http,
當(dāng)我添加證書后,單點(diǎn)登錄正常,但是登出功能總是失敗,表現(xiàn)為服務(wù)端退出,客戶端沒(méi)有退出。
我一直以為客戶端配置的登出有問(wèn)題,搞了半天都沒(méi)成功,后來(lái)我把客戶端的證書去掉,就成功了。想了想大概是因?yàn)槲覀冏约荷傻淖C書不能被服務(wù)端認(rèn)可,因?yàn)榈浅龅臅r(shí)候需要服務(wù)端向客戶端發(fā)起廣播,而我們之前修改的HTTPSandIMAPS-10000001.json文件只是作用于客戶端向服務(wù)端的請(qǐng)求。和登出相反。

在我使用springboot配置證書的時(shí)候,2.1.0.RELEASE以上版本的spring-boot-starter-parent都不行。會(huì)報(bào)錯(cuò)。

到此這篇關(guān)于springboot集成CAS實(shí)現(xiàn)單點(diǎn)登錄的示例代碼的文章就介紹到這了,更多相關(guān)springboot集成CAS單點(diǎn)登錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入淺析jcmd:JDK14中的調(diào)試神器

    深入淺析jcmd:JDK14中的調(diào)試神器

    這篇文章主要介紹了jcmd:JDK14中的調(diào)試神器,本文給大家提到了jcmd的語(yǔ)法,通過(guò)實(shí)例列舉的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • java在集合遍歷過(guò)程中刪除元素5種方法對(duì)比、案例、常見(jiàn)的錯(cuò)誤及其后果

    java在集合遍歷過(guò)程中刪除元素5種方法對(duì)比、案例、常見(jiàn)的錯(cuò)誤及其后果

    這篇文章主要介紹了java在集合遍歷過(guò)程中刪除元素5種方法對(duì)比、案例、常見(jiàn)的錯(cuò)誤及其后果的相關(guān)資料,介紹了五種不同的解決方案,包括使用Iterator.remove()、for-each+手動(dòng)刪除、for循環(huán)反向遍歷、List.removeIf()和使用Stream.filter(),需要的朋友可以參考下
    2024-12-12
  • Java如何實(shí)現(xiàn)長(zhǎng)圖文生成的示例代碼

    Java如何實(shí)現(xiàn)長(zhǎng)圖文生成的示例代碼

    這篇文章主要介紹了Java如何實(shí)現(xiàn)長(zhǎng)圖文生成的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Maven Spring框架依賴包示例詳解

    Maven Spring框架依賴包示例詳解

    這篇文章主要介紹了如何在Maven項(xiàng)目中添加Spring框架的依賴包,包括Spring核心工具包和Spring JDBC,文章還提到在pom.xml文件中添加Spring配置文件頭信息,感興趣的朋友一起看看吧
    2025-03-03
  • 關(guān)于Java集合框架面試題(含答案)下

    關(guān)于Java集合框架面試題(含答案)下

    Java集合框架為Java編程語(yǔ)言的基礎(chǔ),也是Java面試中很重要的一個(gè)知識(shí)點(diǎn)。這里,我列出了一些關(guān)于Java集合的重要問(wèn)題和答案。
    2015-12-12
  • java web激活郵箱并找回密碼

    java web激活郵箱并找回密碼

    這篇文章主要介紹了java web激活郵箱并找回密碼,在項(xiàng)目中要實(shí)現(xiàn)用戶注冊(cè)的郵箱激活以及忘記密碼重置密碼功能,感興趣的小伙伴們
    2015-11-11
  • java利用數(shù)組求平均值,最大值,最小值

    java利用數(shù)組求平均值,最大值,最小值

    java利用數(shù)組求平均值,最大值,最小值。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-10-10
  • MybatisGenerator文件生成不出對(duì)應(yīng)文件的問(wèn)題

    MybatisGenerator文件生成不出對(duì)應(yīng)文件的問(wèn)題

    本文介紹了使用MybatisGenerator生成文件時(shí)遇到的問(wèn)題及解決方法,主要步驟包括檢查目標(biāo)表是否存在、是否能連接到數(shù)據(jù)庫(kù)、配置生成器的路徑等,通過(guò)在項(xiàng)目結(jié)構(gòu)中引入相應(yīng)的jar包,并在GeneratorSqlmap.java文件中運(yùn)行,可以成功生成對(duì)應(yīng)的文件
    2025-01-01
  • 使用React和springboot做前后端分離項(xiàng)目的步驟方式

    使用React和springboot做前后端分離項(xiàng)目的步驟方式

    這篇文章主要介紹了使用React和springboot做前后端分離項(xiàng)目的步驟方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Java之 TreeSet的詳細(xì)使用說(shuō)明

    Java之 TreeSet的詳細(xì)使用說(shuō)明

    這篇文章主要介紹了Java之 TreeSet的詳細(xì)使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02

最新評(píng)論

哈巴河县| 禄劝| 辽阳县| 宜阳县| 专栏| 浦江县| 霞浦县| 福安市| 额济纳旗| 鹤岗市| 华池县| 兴宁市| 沧源| 大渡口区| 龙胜| 德安县| 商南县| 吕梁市| 芦溪县| 津市市| 泰和县| 林州市| 英德市| 滨州市| 紫云| 饶阳县| 阳原县| 夏河县| 河津市| 万山特区| 长岛县| 通化市| 拜泉县| 浠水县| 安图县| 宣武区| 庄河市| 玉山县| 布拖县| 马鞍山市| 通渭县|