7、ssm框架---登陸攔截Interceptor
阿新 • • 發佈:2018-12-12
開發環境: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"; }