java 基于SpringBoot Session攔截器實現登陸功能
標簽: idea springboot spring
本人新手,不足之處,請諒解。 有不足之處,歡迎提出。
下面開始給大家介紹具體的實現:
先說下具體用到的幾個類:
1.在這里先給大家說下Session的主要內容( 檢查session登陸的信息,判斷是否是首頁登陸,(是則通過,不是跳轉登陸頁面)判斷是否是ajax的請求,是則直接放行)
HandlerInterceptor :SpringWebMVC的處理器攔截器,類似于Servlet開發中的過濾器Filter,用于處理器進行預處理和后處理
preHandle:方法是進行處理器攔截用的,顧名思義,該方法將在Controller處理之前進行調用。
postHandle:postHandle是進行處理器攔截用的,它的執行時間是在處理器進行處理之后,也就是在Controller的方法調用之后執行,但是它會在DispatcherServlet進行視圖的渲染之前執行,也就是說在這個方法中你可以對ModelAndView進行操作。
afterCompletion:調用前提:preHandle返回true,調用時間DispatcherServlet進行視圖的渲染之后
下面我來貼出具體代碼
package com.example.admins.system;
import com.example.admins.Bean.UserBean_a;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @describe Session攔截器
*/
public class SessionInterceptor implements HandlerInterceptor {
private static final Logger LOGGER = LoggerFactory.getLogger(SessionInterceptor.class);
/**
* 檢查session中的登錄信息,區別ajax
*/
@Override //獲取請求 和發送請求到服務器中 定義類的名稱
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//獲取類的名稱 賦值給requestURI 參數 進行相關的調用
String requestURI = request.getRequestURI();
//在控制臺輸出 獲取到的所有的相關的路徑
LOGGER.info("Session 檢查,請求 URI:" + requestURI);
// 再次獲取參數賦值給uri的問題
String uri = request.getRequestURI();
//判斷非空
if (uri != null) {
//todo 判斷是否的登陸的首頁 登陸則通過
//String類型有一個方法:contains(),該方法是判斷字符串中是否有子字符串。如果有則返回true,如果沒有則返回false。 page/login是我的登陸頁面
if (uri.contains("/page/login")) {// 登錄請求直接放行 對于某些不需要驗證的uri可以特殊處理
return true;
}
//todo 判斷是否已經登錄 此處的("user") 是登陸中獲取的,判斷是否登陸
UserBean_a member = (UserBean_a) request.getSession().getAttribute("user");
if (member == null) {
if (isAjax(request)) {
LOGGER.info("是ajax請求");
//指定格式防止亂碼
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Content-Type", "text/json;charset=utf-8");
response.setCharacterEncoding("UTF-8");
} else {
//重定向頁面 如果沒有登錄就跳轉到登錄頁面 page/login是我的登陸頁面
response.sendRedirect(request.getContextPath() + "/page/login");
//停止 運行
return false;
}
}
}
//繼續 運行
return true;
}
/**
* 處理成功才進入post處理
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//LOGGER.info(">>>>>>>>>>>請求處理之后進行調用,但是在視圖被渲染之前(Controller方法調用之后)");
}
/**
* 處理完后進入,不論是否拋除異常
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//LOGGER.info(">>>>>>>>>>>在整個請求結束之后被調用,也就是在DispatcherServlet 渲染了對應的視圖之后執行(主要是用于進行資源清理工作)");
}
/**
* @param request
* @return
* @describe 判斷是否是ajax請求
*/
private boolean isAjax(HttpServletRequest request) {
String xrw = request.getHeader("X-Requested-With");
if ("XMLHttpRequest".equalsIgnoreCase(xrw)) {
return true;
}
return false;
}
}
2.下面我來給大家介紹,攔截器的主要類
這個類的位置也很關鍵,請大家注意,這是我遇到的坑
代碼貼上:
package com.example.admins;
import com.example.admins.system.SessionInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
//放在主類上不包括其他東西
//WebMvcConfigurerAdapter這個類,重寫這個類中的方法可以讓我們增加額外的配置
@Configuration
public class WebAppConfigurer implements WebMvcConfigurer {
//addResourceLocations指的是文件放置的目錄
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 多個攔截器組成一個攔截器鏈
registry.addInterceptor(new SessionInterceptor()).addPathPatterns("/**").excludePathPatterns("/static/**");
}
//addResoureHandler指的是對外暴露的訪問路徑 此處一般默認即可
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 靜態資源攔截器
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
}
我說下我在這個類中遇到的坑:excludePathPatterns("/static/**"); 是放行本類中的一些css/js 等樣式,大家在此處應該注意下: 1.是不是所有的樣式在static中 2.直接貼圖,
確認頁面的樣式是不是從static 中進去 如果不是他可能會把你的樣式進行攔截。此處是本人的坑,希望大家注意;
3.最后我來說下:登陸中對此類的應該 控制臺的登陸代碼
貼代碼:
此處的 User 是我們在第一條 登陸判斷的時候的 User ,他從控制臺獲取登陸的數據,來判斷你是否登陸
登錄成功之后將用戶信息保存到session里
session.setAttribute(“user”, userBean1);
//登陸
@RequestMapping(value = "/index")
@ResponseBody
public String lo(UserBean_a userBean, HttpSession session) {
System.out.println("------------控制臺前端輸入的獲取的賬號輸入的" + userBean.getUsername());
UserBean_a userBean1 = userService.userLogin(userBean);
System.out.println("------------userBean1的賬號" +userBean1);
if (userBean1 != null) {
System.out.println(userBean1);
log.debug("用戶登陸成功--{}", JSONObject.toJSONString(userBean1));
// 登錄成功之后將用戶信息保存到session里
session.setAttribute("user", userBean1);
/* System.out.println(md5Pass);*/
return userBean1.toString();
}
log.debug("用戶登陸失敗--{}", JSONObject.toJSONString(userBean1));
return null;
}
這樣就完成了登陸攔截請求。
一個新手、沒背景的野雞大學掙脫出來的野小子,主要以不斷
學習,不斷記錄,用思維認知去看這個世界。寫作、閱讀、分享,用獨自的思考和感悟分享給互聯網里的每一位技術人。
不愛學習的我們,無力的掙扎吧!
智能推薦
SpringBoot(39) —— Shiro實現登陸攔截
1.實現登陸攔截 實現登陸攔截其實就是使用shiro攔截沒有經過認證的用戶的請求,當用戶在沒有認證的情況下就請求資源時,就將其重定向到登陸認證頁面,這一點和spring security一樣 要實現認證+授權,本質上還是在使用過濾器/攔截器,而spring security只是把這些都封裝好了,我們直接調用封裝之后的方法就可以使用;而Shiro對于過濾器/攔截器的封裝沒有spring securi...
SpringBoot 實現攔截器
攔截器在實際工作中使用比較廣泛且相當重要,它的主要作用是攔截用戶的請求并進行相應的處理。比如通過它來進行權限驗證,或者是來判斷用戶是否登陸,等等。在SpringMVC中,我們可以通過XML配置文件來配置一個攔截器,操作起來也很簡單。在SpringBoot中我們需要通過代碼的形式來配置一個攔截器,同樣操作起來也十分簡單,下面我們一起來看一下吧。 項目結構 這是一個實現攔截器的小測試項目,包括以下幾個...
Springboot攔截器實現
Springboot實現攔截器的兩種方法 1:實現接口:HandlerInterceptor 2:繼承HandlerInterceptor 的實現類 HandlerInterceptorAdapter 接口方法 接口 接口名稱 說明 preHandle 前置處理 在實際的Handle執行前執行;返回類型為boolean,如果返回為False,則Handle本身及postHandle/afterCo...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
猜你喜歡
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...