SpringBoot登錄請求攔截器登錄檢查

管理員在谷歌瀏覽器上用用戶名和密碼來登錄後來管理系統,進入到後臺頁面(website.html),這個時候如果把main.html頁面的網址複製到其他瀏覽器(比如火狐等),而在其他瀏覽器一樣可以返回website.html,一樣可以進入後臺管理系統,那麼我們之前所做的用戶名和密碼就沒有任何意義了。
登錄攔截器爲了防止這樣的情況發生而產生,兩個步驟:
HandlerInterceptor和繼承類Config,重寫addInterceptors

我們可以把登錄的信息放在登錄session中:這個是登錄功能的代碼,只要用戶登錄,信息就會在session存在。
@PostMapping(value = "/user/login")
    public String login(@RequestParam("username") String username,
                        @RequestParam("password") String password,
                        Map<String,Object> map, HttpSession session){
        if(!StringUtils.isEmpty(username) && "123456789".equals(password)){
            //登錄成功,防止表單重複提交,可以重定向到主頁
            session.setAttribute("loginUser",username);
            return "redirect:/main.html";
        }else {
            //登錄失敗
            map.put("msg","用戶名或密碼錯誤");
            return "login";
        }
    }

HandlerInterceptor類:
導入三個HandlerInterceptor方法後,在preHandle方法:

package com.bootcrud.component;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
攔截器的作用就是登陸檢查
 */
public class LoginHandlerInterceptor implements HandlerInterceptor {

    //目標方法執行之前
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        Object user = httpServletRequest.getSession().getAttribute("loginUser");
        //判斷loginUser是否爲空
        if (user == null) {
            //未登錄,返回登陸頁面
            httpServletRequest.setAttribute("msg", "沒有權限請先登陸");
            httpServletRequest.getRequestDispatcher("index.html").forward(httpServletRequest, httpServletResponse);
            return false;
        } else {
            //已登陸,放行請求
            return true;
        }
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }

}

判斷Session中是否存在loginUser的登錄信息
Object user = httpServletRequest.getSession().getAttribute(“loginUser”);

HandlerInterceptor寫完之後要配置出來,在Config中定製和擴展mvc,在WebMvcConfigurerAdapter中重寫addInterceptors方法,這個方法就是來註冊攔截器的。

//註冊攔截器
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
//                super.addInterceptors(registry);
                //添加一個攔截器
                //SpringBoot已經做好了靜態資源映射,可以不用來處理靜態資源
                //添加一個攔截器
                registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
                    .excludePathPatterns("/index.html","/","/user/login");
            }

addPathPatterns("/**")是攔截任意多層路徑下的任意請求,但是不是所有請求都攔截,否則連登錄頁面都訪問不到了。
excludePathPatterns是除了括號裏的請求以外的所以請求都攔截。
注意:SpringBoot已經做好了靜態資源映射,可以不用來處理靜態資源

攔截器已經配置好了,重新運行一下項目,在谷歌瀏覽器訪問頁面輸入正確的用戶名和密碼,進入到後臺頁面的時候,再次把wesite.html放到火狐瀏覽器就已經再訪問不到了,因爲我們在火狐瀏覽器中的session沒有website.html的登錄信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章