Spring session實(shí)現(xiàn)共享單點(diǎn)登錄案例過(guò)程解析
一、項(xiàng)目構(gòu)建
1、案例說(shuō)明
本文主要演示單點(diǎn)登錄功能,會(huì)貼出主要配置和代碼以及必要解釋,全部代碼請(qǐng)參考git地址。session共享一個(gè)基本原則是將session存儲(chǔ)在某個(gè)地方,所有的應(yīng)用都可以訪問(wèn),這里使用redis存儲(chǔ)session。當(dāng)應(yīng)用需要認(rèn)證時(shí),先從redis讀取用戶信息。
2、基本配置
1)pom.xml
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session</artifactId> <version>1.3.1.RELEASE</version> </dependency>
2)application.properties
server.port=8080 spring.session.store-type = redis spring.redis.host=192.168.7.151 spring.redis.port=6379
本案例的兩個(gè)應(yīng)用完全一樣,一個(gè)端口是8080,一個(gè)端口是80
3、代碼變動(dòng)
1)新增SimpleImageCode.java
public class SimpleImageCode implements Serializable{
private static final long serialVersionUID = 1L;
private String code;
private LocalDateTime expireTime;
public SimpleImageCode(String code,LocalDateTime expireTime) {
this.code = code;
this.expireTime = expireTime;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public LocalDateTime getExpireTime() {
return expireTime;
}
public void setExpireTime(LocalDateTime expireTime) {
this.expireTime = expireTime;
}
public boolean isExpried() {
return LocalDateTime.now().isAfter(expireTime);
}
}
該類與ImageCode.java基本一樣,區(qū)別1:實(shí)現(xiàn)了Serializable接口;區(qū)別2:沒(méi)有BufferedImage屬性。原因是圖形驗(yàn)證碼要放入session中,而session需要存放到redis中,所以必須實(shí)現(xiàn)序列化接口。一個(gè)類實(shí)現(xiàn)序列化接口,它里面的類屬性也要實(shí)現(xiàn)序列化接口,但是BufferedImage是jdk的類,無(wú)法實(shí)現(xiàn)序列化接口,這樣就不把它放入到redis中,在校驗(yàn)時(shí),我么只會(huì)校驗(yàn)驗(yàn)證碼和過(guò)期時(shí)間,所以不會(huì)影響。
2)修改ValidateCodeController.java
@GetMapping("/code/image")
public void createCode(HttpServletRequest request,HttpServletResponse response) throws Exception {
ImageCode imageCode = createImageCode(request);
SimpleImageCode simpleImageCode = new SimpleImageCode(imageCode.getCode(),imageCode.getExpireTime());
//request.getSession().setAttribute("imageCodeSession", imageCode);
request.getSession().setAttribute("imageCodeSession", simpleImageCode);//序列化到redis中
ImageIO.write(imageCode.getImage(), "JPEG", response.getOutputStream());
}
將SimpleImageCode放入到session中
3)修改ValidateCodeFilter.java
private void validate(HttpServletRequest request){
//ImageCode codeInSession = (ImageCode)request.getSession().getAttribute("imageCodeSession");
SimpleImageCode codeInSession = (SimpleImageCode)request.getSession().getAttribute("imageCodeSession");
String codeInRequest = request.getParameter("imageCode");
... ...//校驗(yàn)邏輯
request.getSession().removeAttribute("imageCodeSession");
}
校驗(yàn)驗(yàn)證碼前從session中取出SimpleImageCode
二、測(cè)試驗(yàn)證
1)啟動(dòng)redis、80端口應(yīng)用、8080端口應(yīng)用,查看redis信息為空,如下:

2)瀏覽器輸入:localhost:8080/index.html,跳轉(zhuǎn)登錄頁(yè)面,查看redis,如下:

3)登錄后,查看redis,如下:

4)同一個(gè)瀏覽器輸入:localhost/index.html,直接跳到index頁(yè)面,查看redis,如下:

5)點(diǎn)擊index.html中的退出連接,查看redis,如下:

6)再次訪問(wèn)localhost:8080/index.html,跳轉(zhuǎn)登錄頁(yè)面,查看redis,如下:

7)再次登錄8080的應(yīng)用,查看redis,如下:

通過(guò)測(cè)試發(fā)現(xiàn)實(shí)現(xiàn)了單點(diǎn)登錄。貼出截圖只是說(shuō)明session存在了redis中,并且會(huì)隨著操作變化。實(shí)際無(wú)需關(guān)心redis。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Springboot+echarts實(shí)現(xiàn)可視化
這篇文章主要為大家詳細(xì)介紹了Springboot+echarts實(shí)現(xiàn)可視化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
JAVA中字符串函數(shù)subString的用法小結(jié)
本篇文章主要是對(duì)JAVA中字符串函數(shù)subString的用法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-02-02
Java實(shí)現(xiàn)開(kāi)箱即用的redis分布式鎖
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)開(kāi)箱即用的基于redis的分布式鎖,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以收藏一下2022-12-12
SpringBoot整合微信登錄功能的實(shí)現(xiàn)方案
今天通過(guò)本文給大家分享微信登錄與SpringBoot整合過(guò)程,微信掃描登錄實(shí)現(xiàn)代碼知道掃描后點(diǎn)擊登錄的全部過(guò)程,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-10-10
Java基于裝飾者模式實(shí)現(xiàn)的染色饅頭案例詳解
這篇文章主要介紹了Java基于裝飾者模式實(shí)現(xiàn)的染色饅頭案例,簡(jiǎn)單描述了裝飾者模式的概念、原理及Java使用裝飾者模式的相關(guān)實(shí)現(xiàn)步驟、操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-05-05
詳解Maven項(xiàng)目缺少M(fèi)aven Dependencies解決方法總結(jié)
這篇文章主要介紹了詳解Maven項(xiàng)目缺少M(fèi)aven Dependencies解決方法總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Java實(shí)現(xiàn)循環(huán)體的過(guò)濾器的方法
這篇文章主要介紹了Java實(shí)現(xiàn)循環(huán)體的過(guò)濾器的方法,需要的朋友可以參考下2014-02-02
Spring整合Quartz Job以及Spring Task的實(shí)現(xiàn)方法
下面小編就為大家分享一篇Spring整合Quartz Job以及Spring Task的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
基于Java的Spring框架來(lái)操作FreeMarker模板的示例
這篇文章主要介紹了基于Java的Spring框架來(lái)操作FreeMarker模板的示例,講到了用于進(jìn)行web模板文件的插值操作等例子,需要的朋友可以參考下2016-03-03

