以前的文章咱們把登陸頁寫了出來,可是想要讓登陸現實他的基本功能,要如何作呢?本篇文章就來幫你實現第一步,讓登陸頁對帳號密碼作校驗,而且完成登陸跳轉。html
@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頁面中將類中的參數放進去,因此找不到咱們須要的值,那麼……數據庫
最後看添加了全部參數後的狀況,咱們在最後看一下;瀏覽器
咱們來看html頁要如何修改呢?緩存
來看,我圖中標記的地方,就是須要添加的東西:session
看,我在下方還用到了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刷新頁面,會發現,頁面提示:問是否須要從新提交表單,那麼爲了避免重複提交表單,咱們須要這樣配置。
if (!StringUtils.isEmpty(username) && "123456".equals(password)) { // 登陸成功,就跳轉到下一個頁面 // 重定向URL return "redirect:/main.html";
registry.addViewController("/main.html").setViewName("dashboard");
3. 再來用正確的帳號密碼登陸一下,查看咱們修改的東西是否生效了,注意看url和頁面:
很棒,效果和咱們想的基本同樣,那麼這還沒完,一個完整的登陸還有其餘的問題,好比咱們把這個url複製到其餘瀏覽器會是什麼樣子的?
依然能訪問成功,那咱們作登陸還有卵用,因此這個時候,攔截器的做用就體現出來了。
首先,瞭解一下攔截器的做用,他是用來作登陸檢查的,也就是沒有前邊的登陸,就不能夠訪問後邊的頁面。
如何實現,來看:
/** * 攔截器,登陸檢查 */ 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 { } }
// 註冊攔截器 @Override public void addInterceptors(InterceptorRegistry registry) { // 添加攔截的請求,並排除幾個不攔截的請求 registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**") .excludePathPatterns("/index.html", "/", "/user/login"); }
這樣,除了首頁的請求意外,其餘請求都會被攔截下來,咱們再看這樣配置之後的效果:
當咱們直接訪問localhost:8080/main.html時:
這時候,就只能經過攔截器排除的那幾個請求來訪問和登陸後才能正常訪問了