1. 程式人生 > >使用SpringMVC攔截器實現簡單的登陸驗證功能(面向小白)

使用SpringMVC攔截器實現簡單的登陸驗證功能(面向小白)

接著上一篇文章《使用Idea建立一個JavaWeb的SSM(maven)專案實現登陸功能》

在上一篇文章裡已經實現了頁面登陸的功能,但是不夠完善,在沒有攔截器的情況下我可以不登陸一樣可以訪問index.jsp頁面

如圖

在這種情況下專案是有風險的,別人可以在不登陸的情況下隨意訪問你的專案路徑

這時候就可以使用攔截器來避免這種情況(這裡只是最簡單的實現,別的可以自己琢磨琢磨~)

在你的springMVC.xml配置檔案種加上攔截器和過濾靜態資源

 <!--攔截器 -->
	 <mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/**" />
			<mvc:exclude-mapping path="/login/toLogin*" /><!--這是指明某些請求不需要經過攔截器-->
			<mvc:exclude-mapping path="/login/login*" />
			<bean class="com.sixmai.interceptor.LoginInterceptor"></bean><!--這裡是你配置的攔截器的路徑-->
		</mvc:interceptor>
	</mvc:interceptors>

	<!-- 過濾靜態資源 -->
	<mvc:default-servlet-handler />

然後在你的原來登陸的controller裡新增一段程式碼,登陸成功就把你的登陸名存進session 如圖

(也許我們的方法不一樣,但是原理都一樣,我用的session你也可以用cookie或者是Redis)

package com.sixmai.controller;

import com.sixmai.domain.User;
import com.sixmai.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpSession;
import java.util.Map;

@Controller
@RequestMapping("login")
public class LoginController {
    @Autowired
    private LoginService loginService;

    @RequestMapping("toLogin")
    public String toLogin() {
        return "login.jsp";
    }

    @RequestMapping("login")
    public String login(User user, Model model, HttpSession session) {
        String loginname = user.getLoginname();
        String password = user.getPassword();
        Map<String, Object> map = loginService.login(loginname, password);
        if (map.get("status").equals("200")) {
//============================如果登陸成功就把使用者名稱存進session====================
            session.setAttribute("loginname",loginname);
//===============================================================================
            return "system/index.jsp";
        } else {
            model.addAttribute("error", map.get("msg"));
            return "login.jsp";
        }
    }

}

修改好了以後在專案種建立一個interceptor資料夾

接下來在interceptor資料夾種新增一個攔截器(LoginInterceptor)並且實現HandlerInterceptor 重寫它的方法

package com.sixmai.interceptor;

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;

public class LoginInterceptor implements HandlerInterceptor {
    //之前執行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
        HttpSession session = request.getSession();
        String loginname = (String) session.getAttribute("loginname");//從session取出登陸名
        if (loginname !=null&&!loginname.equals("")){//判斷是否存進去了登陸名,沒有存進去就是沒登陸
            return true;
        }
               request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);//沒登陸就給你跳轉到登陸頁面
        return false;
    }

    @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 {

    }
}

到這裡基本就配置完成了

當我再次想通過訪問/index/toIndex訪問index.jsp頁面的時候就給我自動跳轉到了login.jsp頁面

 

The end!!!