1. 程式人生 > >SpringBoot29 登入邏輯、登入狀態判斷

SpringBoot29 登入邏輯、登入狀態判斷

1 知識點掃盲

  瀏覽器和伺服器之間時通過session來確定連線狀態的,瀏覽器第一次請求時服務端會自動生成一個session,並將這個sessionId傳回給瀏覽器,瀏覽器將這個sessionId存放在cookie中,下一次瀏覽器訪問伺服器時就會將這個sessionId以cookie的形式傳遞到伺服器,伺服器接送到這個sessionId後就可以判斷髮送這個請求的瀏覽器之前是否訪問過。

  在進行登入認證邏輯時,通常會在登入認證成功後將使用者資訊儲存到session中;整個系統會對出登入和登出操作之外的請求進行攔截,在攔截器中會判斷session中是否有使用者的資料,如果有就跳轉到controller層執行對應的請求,如果沒有就直接返回一個提示資訊。(PS: 每個客戶端第一次訪問伺服器時服務端都會自動建立一個session)

2 基於SpringBoot的登入狀態判斷

  2.1 整體流程圖

  2.2 程式碼實現

    2.2.1 建立一個SpringBoot

      利用IDEA建立一個SpringBoot專案,只引入web模組

    2.2.2 建立一個攔截器

      攔截出登入請求以外的所有請求,通過判斷session是否有使用者資訊來判斷登入狀態

package com.xunyji.springboot_login_session.interceptor;

import lombok.extern.slf4j.Slf4j;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * @author 王楊帥 * @create 2018-09-11 21:31 * @desc 登入狀態攔截器 *
*/ @Slf4j public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { log.info("==========登入狀態攔截"); HttpSession session = request.getSession(); log.info("sessionId為:" + session.getId()); // 獲取使用者資訊,如果沒有使用者資訊直接返回提示資訊 Object userInfo = session.getAttribute("userInfo"); if (userInfo == null) { log.info("沒有登入"); response.getWriter().write("Please Login In"); return false; } else { log.info("已經登入過啦,使用者資訊為:" + session.getAttribute("userInfo")); } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { } }
LoginInterceptor.java

    2.2.3 新增攔截器

package com.xunyji.springboot_login_session.config;

import com.xunyji.springboot_login_session.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author 王楊帥
 * @create 2018-09-11 21:35
 * @desc
 **/
@Configuration
public class LoginConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/test/login");
    }
}
LoginConfig.java

    2,2.4 測試控制層

package com.xunyji.springboot_login_session.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * @author 王楊帥
 * @create 2018-09-11 21:17
 * @desc
 **/
@RestController
@RequestMapping(value = "/test")
@Slf4j
public class TestController {

    @GetMapping(value = "/test01")
    public String test01() {
        String info = "測試01";
        log.info(info);
        return info;
    }

    @GetMapping(value = "/test02")
    public String test02() {
        String info = "test02";
        log.info(info);
        return info;
    }

    /**
     * 登入邏輯
     * @param name 使用者名稱
     * @param pwd 使用者密碼
     * @param request
     * @return
     */
    @GetMapping(value = "/login")
    public String login(
            @RequestParam(value = "name") String name,
            @RequestParam(value = "pwd") String pwd,
            HttpServletRequest request
    ) {
        String info = "登入邏輯";
        log.info(info);

        // 登入認證,認證成功後將使用者資訊放到session中
        if (name.equals("fury") && pwd.equals("111111")) {
            request.getSession().setAttribute("userInfo", name + " - " + pwd);
            info = "登入成功";
        } else {
            info = "登入失敗";
        }

        log.info(info);
        return info;
    }

    /**
     * 登出操作
     * @param request
     * @return
     */
    @GetMapping(value = "/loginout")
    public String loginout(HttpServletRequest request) {
        String info = "登出操作";
        log.info(info);
        HttpSession session = request.getSession();

        // 將使用者資訊從session中刪除
        session.removeAttribute("userInfo");

        Object userInfo = session.getAttribute("userInfo");
        if (userInfo == null) {
            info = "登出成功";
        } else {
            info = "登出失敗";
        }
        log.info(info);

        return info;

    }

}
TestController.java

3 程式碼彙總

  點選獲取