Spring session實現共享單點登入案例過程解析
一、專案構建
1、案例說明
本文主要演示單點登入功能,會貼出主要配置和程式碼以及必要解釋,全部程式碼請參考git地址。session共享一個基本原則是將session儲存在某個地方,所有的應用都可以訪問,這裡使用redis儲存session。當應用需要認證時,先從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
本案例的兩個應用完全一樣,一個埠是8080,一個埠是80
3、程式碼變動
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基本一樣,區別1:實現了Serializable介面;區別2:沒有BufferedImage屬性。原因是圖形驗證碼要放入session中,而session需要存放到redis中,所以必須實現序列化介面。一個類實現序列化介面,它裡面的類屬性也要實現序列化介面,但是BufferedImage是jdk的類,無法實現序列化介面,這樣就不把它放入到redis中,在校驗時,我麼只會校驗驗證碼和過期時間,所以不會影響。
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"); ... ...//校驗邏輯 request.getSession().removeAttribute("imageCodeSession"); }
校驗驗證碼前從session中取出SimpleImageCode
二、測試驗證
1)啟動redis、80埠應用、8080埠應用,檢視redis資訊為空,如下:
2)瀏覽器輸入:localhost:8080/index.html,跳轉登入頁面,檢視redis,如下:
3)登入後,檢視redis,如下:
4)同一個瀏覽器輸入:localhost/index.html,直接跳到index頁面,檢視redis,如下:
5)點選index.html中的退出連線,檢視redis,如下:
6)再次訪問localhost:8080/index.html,跳轉登入頁面,檢視redis,如下:
7)再次登入8080的應用,檢視redis,如下:
通過測試發現實現了單點登入。貼出截圖只是說明session存在了redis中,並且會隨著操作變化。實際無需關心redis。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。