1. 程式人生 > >7、ssm框架---登陸攔截Interceptor

7、ssm框架---登陸攔截Interceptor

開發環境:Idea2018.2+maven3.5.4 實現效果: 進行增刪改查頁面只有登陸才能進行操作,登入和註冊頁面不攔截,被攔截之後自動轉到登入頁面

一、在springmvc.xml中配置攔截器

<!-- 配置用於session驗證的攔截器 -->
    <mvc:interceptors>
        <bean class="com.ssm.interceptor.LoginInterceptor"></bean>
    </mvc:interceptors>

二、自己定義一個攔截器類LoginInterceptor.java

package com.ssm.interceptor;
import com.ssm.model.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * return false表示攔截,不向下執行
 * return true表示放行,不攔截
 */
public class LoginInterceptor implements HandlerInterceptor {
    //首先會執行的方法
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
	//   boolean flag = false;
        //獲取請求資源
        String requestURI = request.getRequestURI();
        //指定不攔截的路徑
        final String[] IGNORE_URI = {"/user/register","/user/login", "/user/registerjump","/user/loginjump" };

        //指定攔截的路徑,需要登入才可以進入的頁面
        final String[] PRE_UNIGNORE_URI = {
                "/user/toAddUser","/user/addUser","/user/getAllUser",
                "/user/toUpdate","/user/updateUser", "/user/delUser","/user/list"
        };

        //jsp獲得當前頁面名稱 sunString:擷取一部分   requestURI.lastIndexOf:表示從uri的最後一個/開始擷取
        //比如uri是"C:/abc/edf/123.txt" ,結果就是/123   擷取最後一個/和.之間的部分
        String uri = requestURI.substring(requestURI.lastIndexOf("/"));
        //這部分url是特定的,不攔截。   return true表示放行
        if (uri.startsWith("/user/registerjump") || uri.startsWith("/user/loginjump") || uri.startsWith("/user/register")|| uri.startsWith("/user/login")) {
            return true;
        }

        //從session中獲取物件
        User user = (User) request.getSession().getAttribute("user");
        //執行迴圈,依次取出要攔截的欄位,如果請求的url中包含該欄位,flag=true
        for (String preURI : PRE_UNIGNORE_URI) {
            if (requestURI.contains(preURI)) {
//                flag = true;
                if(user!=null){
                    return true;
                }else{
                    String loginUrl = "/user/loginjump";
                    response.sendRedirect(request.getContextPath() + loginUrl);
                }
            }
        }

//        //有個頁面要攔截,判斷一下使用者是否已經登入: 登入就放行,未登入就攔截
//        if (flag==true) {  //flag為真,表示是攔截的欄位,並且session中沒有這個使用者,就重定向到登入頁面

        return true;

    }

    //返回ModelAndView之前執行的方法,面向切面程式設計中的體現,已經進入了controller
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
//        System.out.println("進入了postHandle。。。。。。");
    }

    //執行Handle完成之後執行的方法
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
//        System.out.println("進入了afterHandle。。。。。。");
    }
}

三、在Controller類的登入控制器方法中,把登入之後的user物件儲存在session中,因為在攔截器類中要判斷是否登入。主要程式碼如下:

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private HttpServletRequest request; //自動注入request

    @Autowired
    private IUserService userService;

 /**
     * 登入驗證,登入成功跳轉到使用者資訊頁面
     * @param name
     * @param password
     * @param model
     * @return
     */
    @RequestMapping("login")
    public String login(@Param("name")String name, @Param("password")String password, Model model) {
        User user=userService.checkByName(name);
        if(name==null||"".equals(name)){  //沒有輸入姓名
            model.addAttribute("msg1","請輸入姓名");
        }else if(user==null||"".trim().equals(user)){ //輸入姓名但是姓名錯誤
            model.addAttribute("msg1","賬戶不存在,請先註冊");
            return "login";
        }else if(user!=null &(password==null||"".equals(password))){ //姓名正確,但沒有輸入密碼
            model.addAttribute("msg2","請輸入密碼");
        }else if(user!=null &!(user.getPassword().equals(password))) { //姓名正確,輸入密碼,但是密碼錯誤
            model.addAttribute("msg2","密碼錯誤");

        }else if (user!=null &user.getPassword().equals(password)){ //姓名密碼均正確
//            return "redirect:/user/getAllUser";
            HttpSession session = request.getSession();
            session.setAttribute("user",user);
            return "redirect:/user/list";
        }
        return "login";
    }