SpringBoot日記——登陸與攔截器篇

  以前的文章咱們把登陸頁寫了出來,可是想要讓登陸現實他的基本功能,要如何作呢?本篇文章就來幫你實現第一步,讓登陸頁對帳號密碼作校驗,而且完成登陸跳轉。html

 

LoginController

  1. 要實現登陸,咱們須要先編寫一個登陸的controller類:(每一步的註釋應該比較詳細了~)

@Controller
public class LoginController {

    // 發送post請求,代替了RequestMapping(value="/user/login", method="post")
    @PostMapping(value = "/user/login")
    // 對登陸請求判斷request的參數值,並存放在map中
    public String login(@RequestParam("username") String username,
                        @RequestParam("password") String password,
                        Map<String, Object> map) {
        // 咱們判斷,若是登陸名不是空,而且,密碼是 123456 就登陸成功(暫不涉及數據庫)
        if (!StringUtils.isEmpty(username) && "123456".equals(password)) {
            // 登陸成功,就跳轉到下一個頁面
            return "dashboard";
        } else {
            // 登陸失敗,刷新本登陸頁
            map.put("msg", "用戶名密碼錯誤");
            return "login";
        }
    }

}

  爲了開發方便,咱們還能夠將application.properties中添加一個 禁用緩存的參數: spring.thymeleaf.cache=fasle ,這樣html頁面有改動的時候,咱們只須要用快捷鍵crtl+F9或者點擊如圖的編譯按鈕,從新編譯下就能夠在頁面看結果,而不須要再次啓動Tomcat服務了。spring

 

  這時候訪問頁面,會報錯,是由於咱們沒有在html頁面中將類中的參數放進去,因此找不到咱們須要的值,那麼……數據庫

2. 校驗頁面

  先來看,沒有配置html頁時訪問的狀況,表示徹底沒有關聯或者獲取的頁面的數據;

  而後咱們添加下方參數配置再看,若只添加action和method,會是神馬狀況:(表示String的參數username不存在)

  最後看添加了全部參數後的狀況,咱們在最後看一下;瀏覽器

 

login.HTML

  咱們來看html頁要如何修改呢?緩存

  來看,我圖中標記的地方,就是須要添加的東西:session

  1. 首先添加th:action,告訴模板,咱們要跳轉的請求是user/login,並且是post請求的;

  2.告訴模板,咱們的參數名稱是username和password,這也是controller類中設定的參數值,要徹底一致。 

  

    3.注意,咱們以前說若是帳號密碼不對,要有個msg提示,可這msg在模板中並無表現,因此,咱們要在html中添加一段關於msg的判斷:若是msg是空,就不展現mgs,若是不爲空就展現:

  看,我在下方還用到了th:if語句,這個在官方文檔中有記錄如何使用,並且優先級比較高,因此會優先判斷這個方法是否生效,而後才展現text。app

<p style="color: red;" th:text="${msg}" th:if="${not #strings.isEmpty(msg)}"></p>

 

    好,接下來咱們試一下,是否成功了,先輸入帳號admin,密碼111,點擊登陸,看跳轉是否依然仍是login頁:ide

 

 

   而後來看,帳號admin,密碼123456,是否跳轉到下一頁中:post

  咱們的跳轉是成功的,只是樣式有些問題,稍後,咱們來看怎麼處理。url

試圖映射與重定向

  跳轉沒問題了,但是還有另外一個問題,當咱們進入到跳轉頁之後,按F5刷新頁面,會發現,頁面提示:問是否須要從新提交表單,那麼爲了避免重複提交表單,咱們須要這樣配置。

  1. 首先在咱們以前的LoginController類中添加映射:(修改return ,將咱們的請求定向到另外一個路徑,而非/user/login)

        if (!StringUtils.isEmpty(username) && "123456".equals(password)) {
            // 登陸成功,就跳轉到下一個頁面
            // 重定向URL
            return "redirect:/main.html";

  2.而後在以前的MyMvcConfig中添加一下映射的路徑,讓上邊的main.html引到咱們想要跳轉的那個「dashboard」頁。

registry.addViewController("/main.html").setViewName("dashboard");

  3. 再來用正確的帳號密碼登陸一下,查看咱們修改的東西是否生效了,注意看url和頁面:

  很棒,效果和咱們想的基本同樣,那麼這還沒完,一個完整的登陸還有其餘的問題,好比咱們把這個url複製到其餘瀏覽器會是什麼樣子的?

  依然能訪問成功,那咱們作登陸還有卵用,因此這個時候,攔截器的做用就體現出來了。

 

攔截器

  首先,瞭解一下攔截器的做用,他是用來作登陸檢查的,也就是沒有前邊的登陸,就不能夠訪問後邊的頁面。

  如何實現,來看:

  1. 先添加一個攔截器,咱們新建一個登陸的攔截器在component包下,名字就叫  LoginHandlerInterceptor (實現接口HandlerInterceptor),IDEA編譯器,咱們按ctrl+O,把須要用到的三個接口都拉出來,而後開始編寫:

/**
 * 攔截器,登陸檢查
 */

public class LoginHandlerInterceptor implements HandlerInterceptor {
    // 目標方法執行以前
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Object user = request.getSession().getAttribute("loginUser");
        // 若是獲取的request的session中的loginUser參數爲空(未登陸),就返回登陸頁,不然放行訪問
        if (user == null) {
            // 未登陸,給出錯誤信息,
            request.setAttribute("msg","無權限請先登陸");
            // 獲取request返回頁面到登陸頁
            request.getRequestDispatcher("/index.html").forward(request, response);
            return false;
        } else {
            // 已登陸,放行
            return true;
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

  2. 上邊配置的session須要取值才能作判斷,那麼咱們須要在controller中設置這個session值,以讓它生效:

  3. 以前說過,要讓登陸有個攔截器的功能,就是除了訪問首頁咱們能夠,其餘未登陸的都攔截下來,因此,須要在MyMvcConfig中添加一個攔截器,讓上邊的配置都有做用:

    // 註冊攔截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 添加攔截的請求,並排除幾個不攔截的請求
        registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
                .excludePathPatterns("/index.html", "/", "/user/login");
    }

  這樣,除了首頁的請求意外,其餘請求都會被攔截下來,咱們再看這樣配置之後的效果:

  當咱們直接訪問localhost:8080/main.html時:

  這時候,就只能經過攔截器排除的那幾個請求來訪問和登陸後才能正常訪問了

相關文章
相關標籤/搜索