日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
實(shí)戰(zhàn)用戶登錄、Session校驗、分布式存儲Session

實(shí)戰(zhàn) 用戶登錄、SESSION校驗、分布式存儲Session

作者: 田維常 2021-03-08 09:56:24
存儲
存儲軟件
分布式 一般會將web容器所在的服務(wù)器和redis所在的服務(wù)器放在同一個機(jī)房,減少網(wǎng)絡(luò)開銷,走內(nèi)網(wǎng)進(jìn)行連接。

創(chuàng)新互聯(lián)公司是專業(yè)的沙灣網(wǎng)站建設(shè)公司,沙灣接單;提供網(wǎng)站設(shè)計、成都網(wǎng)站制作,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行沙灣網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!

實(shí)現(xiàn)登錄功能

然后再創(chuàng)建login.css存放于在static下,css目錄中,id 為 content 的 樣式;

  
 
 
 
  1. #content { 
  2.         margin-left: 220px; 
  3.         margin-right: 1420px; 
  4.         margin-top: 100px; 
  5.         margin-bottom: auto; 
  6.         background-color: orange; 
  7.     } 

創(chuàng)建login.html登錄頁面

   
 
 
 
  1.  
  2.  
  3.  
  4.      
  5.     登錄 
  6.      
  7.      
  8.  
  9.  
  10.  
  11.      
  12.     [[${errorMsg}]] 
  13.      
  14.         姓名:
     
  15.         密碼:
     
  16.         登錄 
  17.      
 
  •  
  •  
  • 前面的這一部分是前端的,下面來把后端代碼給寫完:

    UserRepository中添加方法的定義:

      
     
     
     
    1. //通過用戶名和密碼查找用戶 
    2. List findByUnameAndPassword(String uname, String password); 

    UserService和實(shí)現(xiàn)類中添加方法如下:

      
     
     
     
    1. /通過用戶名和密碼查找用戶 
    2. List findByUnameAndPassword(String uname, String password); 
    3. UserService和實(shí)現(xiàn)類中添加方法如下: 
    4.  
    5. // UserService  
    6. User login(User user); 
    7.  
    8. @Service 
    9. //把事務(wù)注解放在類上了,這樣下面就不需要每次都在方法寫這個注解了 
    10. @Transactional(rollbackFor = Exception.class) 
    11. public class UserServiceImpl implements UserService { 
    12.     //...... 
    13.     @Override 
    14.     public User login(User user) { 
    15.         List userList = userRepository.findByUnameAndPassword(user.getUname(), user.getPassword()); 
    16.         //防止有多個用戶名相同,并且密碼也相同的用戶 
    17.         if (!CollectionUtils.isEmpty(userList)) { 
    18.             return userList.get(0); 
    19.         } 
    20.         return null; 
    21.     } 

    UserController中添加方法如下:

      
     
     
     
    1. @RequestMapping(value = "/loginPage", method = RequestMethod.GET) 
    2. public String loginPage(Model model) { 
    3.     return "login"; 
    4.  
    5. @RequestMapping(value = "/login", method = RequestMethod.POST) 
    6. public String login(Model model, User user) { 
    7.     User result = userService.login(user); 
    8.     if (result != null) { 
    9.         //登錄成功,跳轉(zhuǎn)到用戶列表 
    10.         return "redirect:/userList"; 
    11.     } 
    12.     //不成功,提示 
    13.     model.addAttribute("errorMsg", "用戶名或密碼不正確"); 
    14.     return "login"; 

    啟動項目,訪問

    http://localhost:8080/loginPage

    進(jìn)入登錄頁面。

    輸入用戶名密碼。密碼錯誤:

    輸入正確的用戶名和密碼,那么跳轉(zhuǎn)到用戶列表。

    這樣,我們一個簡單的登錄功能就搞定了。

    如果我們需要在修改用戶信息的時候,校驗是否已經(jīng)登錄,怎么辦呢?

    攔截器

    創(chuàng)建自定義的攔截器并實(shí)現(xiàn)HandlerInterceptor接口 。

      
     
     
     
    1. import org.springframework.lang.Nullable; 
    2. import org.springframework.web.servlet.HandlerInterceptor; 
    3. import org.springframework.web.servlet.ModelAndView; 
    4.  
    5. import javax.servlet.http.HttpServletRequest; 
    6. import javax.servlet.http.HttpServletResponse; 
    7.  
    8. public class SessionInterceptor implements HandlerInterceptor { 
    9.     @Override 
    10.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
    11.         //session校驗 
    12.         Object object = request.getSession().getAttribute("users"); 
    13.         if (null == object) { 
    14.             response.sendRedirect("/loginPage"); 
    15.             return false; 
    16.         } 
    17.         return true; 
    18.     } 

    創(chuàng)建一個java類繼承WebMvcConfiguraeAdapter并重寫addInterceptor方法(該類用來添加配置攔截器在該類中添加配置攔截器,以及配置過濾)。

      
     
     
     
    1. import org.springframework.context.annotation.Configuration; 
    2. import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 
    3. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 
    4.  
    5. @Configuration 
    6. public class MyInterceptor extends WebMvcConfigurerAdapter { 
    7.  
    8.     @Override 
    9.     public void addInterceptors(InterceptorRegistry registry) { 
    10.         //可以添加多個攔截 
    11.         registry.addInterceptor(new SessionInterceptor()) 
    12.             //也可以添加多個攔截路徑,"/**"攔截所有 
    13.                 .addPathPatterns("/update/**"); 
    14.     } 

    再把登錄Controller方法調(diào)整,把session信息存進(jìn)去。

      
     
     
     
    1. @RequestMapping(value = "/login", method = RequestMethod.POST) 
    2. public String login(Model model, User user, HttpServletRequest request) { 
    3.     User result = userService.login(user); 
    4.     if (result != null) { 
    5.         //用戶信息保存在session 
    6.         request.getSession().setAttribute("users", user.getUname()); 
    7.         return "redirect:/userList"; 
    8.     } 
    9.     model.addAttribute("errorMsg", "用戶名或密碼不正確"); 
    10.     return "login"; 

    再次訪問用戶列表:

    http://localhost:8080/userList

    這時候,我們訪問修改用戶信息這個功能,跳轉(zhuǎn)到了登錄頁面。

    登錄后,再次訪問修改用戶信息這個功能。

    這樣便來到用戶信息修改頁面。

    到此,我們就實(shí)現(xiàn)了一個簡單的session來接校驗。

    如果,我們服務(wù)器重啟后,session就沒了,因為session是保存在我們服務(wù)端的,并且還是在服務(wù)器內(nèi)存里的。

    session分布式有四種方案

    方案一:客戶端存儲

    直接將信息存儲在cookie中,cookie是存儲在客戶端上的一小段數(shù)據(jù),客戶端通過http協(xié)議和服務(wù)器進(jìn)行cookie交互,通常用來存儲一些不敏感信息

    缺點(diǎn)

    • 數(shù)據(jù)存儲在客戶端,存在安全隱患。
    • cookie存儲大小、類型存在限制。
    • 數(shù)據(jù)存儲在cookie中,如果一次請求cookie過大,會給網(wǎng)絡(luò)增加更大的開銷。

    方案二:session復(fù)制

    session復(fù)制是小型企業(yè)應(yīng)用使用較多的一種服務(wù)器集群session管理機(jī)制,在真正的開發(fā)使用的并不是很多,通過對web服務(wù)器(例如Tomcat)進(jìn)行搭建集群。

    缺點(diǎn)

    session同步的原理是在同一個局域網(wǎng)里面通過發(fā)送廣播來異步同步session的,一旦服務(wù)器多了,并發(fā)上來了,session需要同步的數(shù)據(jù)量就大了,需要將其他服務(wù)器上的session全部同步到本服務(wù)器上,會帶來一定的網(wǎng)路開銷,在用戶量特別大的時候,會出現(xiàn)內(nèi)存不足的情況。

    優(yōu)點(diǎn)

    服務(wù)器之間的session信息都是同步的,任何一臺服務(wù)器宕機(jī)的時候不會影響另外服務(wù)器中session的狀態(tài),配置相對簡單

    Tomcat內(nèi)部已經(jīng)支持分布式架構(gòu)開發(fā)管理機(jī)制,可以對tomcat修改配置來支持session復(fù)制,在集群中的幾臺服務(wù)器之間同步session對象,使每臺服務(wù)器上都保存了所有用戶的session信息,這樣任何一臺本機(jī)宕機(jī)都不會導(dǎo)致session數(shù)據(jù)的丟失,而服務(wù)器使用session時,也只需要在本機(jī)獲取即可。

    如何配置?

    在Tomcat安裝目錄下的config目錄中的server.xml文件中,將注釋打開,tomcat必須在同一個網(wǎng)關(guān)內(nèi),要不然收不到廣播,同步不了session,在web.xml中開啟session復(fù)制:。

    方案三:session綁定:

    Nginx是一款自由的、開源的、高性能的http服務(wù)器和反向代理服務(wù)器

    Nginx能做什么?

    反向代理、負(fù)載均衡、http服務(wù)器(動靜代理)、正向代理

    如何使用nginx進(jìn)行session綁定

    我們利用nginx的反向代理和負(fù)載均衡,之前是客戶端會被分配到其中一臺服務(wù)器進(jìn)行處理,具體分配到哪臺服務(wù)器進(jìn)行處理還得看服務(wù)器的負(fù)載均衡算法(輪詢、隨機(jī)、ip-hash、權(quán)重等),但是我們可以基于nginx的ip-hash策略,可以對客戶端和服務(wù)器進(jìn)行綁定,同一個客戶端就只能訪問該服務(wù)器,無論客戶端發(fā)送多少次請求都被同一個服務(wù)器處理。

    缺點(diǎn)

    容易造成單點(diǎn)故障,如果有一臺服務(wù)器宕機(jī),那么該臺服務(wù)器上的session信息將會丟失

    前端不能有負(fù)載均衡,如果有,session綁定將會出問題

    優(yōu)點(diǎn)

    • 配置簡單

    方案四:基于redis存儲session方案

    優(yōu)點(diǎn)

    • 這是企業(yè)中使用的最多的一種方式
    • spring為我們封裝好了spring-session,直接引入依賴即可
    • 數(shù)據(jù)保存在redis中,無縫接入,不存在任何安全隱患
    • redis自身可做集群,搭建主從,同時方便管理

    缺點(diǎn)

    多了一次網(wǎng)絡(luò)調(diào)用,web容器需要向redis訪問。

    一般會將web容器所在的服務(wù)器和redis所在的服務(wù)器放在同一個機(jī)房,減少網(wǎng)絡(luò)開銷,走內(nèi)網(wǎng)進(jìn)行連接。

    來源:http://45dwz.com/xeP0J

    實(shí)現(xiàn)基于redis分布式存儲session方案

    安裝Redis,這里就不說了,不會安裝可以聯(lián)系我。

    集成Redis

    添加依賴

      
     
     
     
    1.  
    2.     org.springframework.boot 
    3.     spring-boot-starter-data-redis 
    4.  
    5.  
    6.  
    7.     org.apache.commons 
    8.     commons-pool2 
    9.  
    10.  
    11.     org.springframework.session 
    12.     spring-session-data-redis 
    13.  

    添加Redis配置

      
     
     
     
    1. # Redis數(shù)據(jù)庫索引(默認(rèn)為0) 
    2. spring.redis.database=0 
    3. # Redis服務(wù)器地址 
    4. spring.redis.host=127.0.0.1 
    5. # Redis服務(wù)器連接端口 
    6. spring.redis.port=6379 
    7. # Redis服務(wù)器連接密碼(默認(rèn)為空) 
    8. spring.redis.password= 
    9. # 連接池最大連接數(shù)(使用負(fù)值表示沒有限制) 
    10. spring.redis.jedis.pool.max-active=20 
    11. # 連接池最大阻塞等待時間(使用負(fù)值表示沒有限制) 
    12. spring.redis.jedis.pool.max-wait=-1 
    13. # 連接池中的最大空閑連接 
    14. spring.redis.jedis.pool.max-idle=10 
    15. # 連接池中的最小空閑連接 
    16. spring.redis.jedis.pool.min-idle=0 
    17. # 連接超時時間(毫秒) 
    18. spring.redis.timeout=1000 

    將session添加入Redis中

    在啟動類上添加@EnableRedisHttpSession注解。

      
     
     
     
    1. @SpringBootApplication 
    2. @EnableRedisHttpSession 
    3. public class Application { 
    4.     public static void main(String[] args) { 
    5.         SpringApplication.run(Application.class, args); 
    6.     } 

    啟動項目,然后,再次登錄后,便可以在Redis里查到了

    再次重啟項目后,發(fā)現(xiàn)修改用戶信息的時候,并不需要重新登錄了。

    到此,基于Redis分布式存儲session方案就已經(jīng)搞定了。

    總結(jié)

    本文首先是實(shí)戰(zhàn)了登錄功能,其次接著實(shí)現(xiàn)了校驗session攔截處理,然后總結(jié)出session分布式四種方案,最后實(shí)現(xiàn)了基于redis存儲session的方案。

    本文轉(zhuǎn)載自微信公眾號「Java后端技術(shù)全?!?,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Java后端技術(shù)全棧公眾號。


    本文標(biāo)題:實(shí)戰(zhàn)用戶登錄、Session校驗、分布式存儲Session
    分享URL:http://m.5511xx.com/article/coojseg.html