SpringMVC拦截器(实现登录验证拦截器)
本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现
当用户点击到网站主页时要进行拦截,用户登录了才能进入网站主页,否则进入登陆页面
核心代码
首先是index.jsp,显示链接
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 12 <title>首页</title> 13 <meta http-equiv="pragma" content="no-cache"> 14 <meta http-equiv="cache-control" content="no-cache"> 15 <meta http-equiv="expires" content="0"> 16 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 17 <meta http-equiv="description" content="This is my page"> 18 <!-- 19 <link rel="stylesheet" type="text/css" href="styles.css"> 20 --> 21 </head> 22 23 <body> 24 <div style="margin:0 auto;padding-top:100px;font-size:18px;" align="center"> 25 <p><a href="loginpage.html">登陆</a></p> 26 <p><a href="user/home.html">用户中心</a></p> 27 <p><a href="exception.html">触发异常</a></p> 28 </div> 29 </body> 30 </html>
controller类
1 package com.jikexueyuan.demo.springmvc.lesson4.controller; 2 3 import javax.annotation.Resource; 4 import javax.servlet.http.HttpServletRequest; 5 6 import org.springframework.stereotype.Controller; 7 import org.springframework.web.bind.annotation.RequestMapping; 8 import org.springframework.web.bind.annotation.RequestMethod; 9 import org.springframework.web.bind.annotation.RequestParam; 10 11 import com.jikexueyuan.demo.springmvc.lesson4.constant.Global; 12 import com.jikexueyuan.demo.springmvc.lesson4.exception.MyException; 13 import com.jikexueyuan.demo.springmvc.lesson4.model.User; 14 import com.jikexueyuan.demo.springmvc.lesson4.service.LoginService; 15 16 /** 17 * 这个例子讲解了如何定义MVC三层注解,使用@Resource进行注入,以及使用@RequestMapping、@RequestParam 、@SessionAttributes 18 */ 19 20 @Controller 21 public class LoginController extends BaseController { 22 23 @Resource 24 LoginService service; 25 26 @Resource 27 HttpServletRequest request; 28 29 @RequestMapping("/exception") 30 public void exception() throws MyException{ 31 throw new MyException("测试springmvc中的异常捕获"); 32 } 33 34 @RequestMapping("/loginpage") 35 public String toLoginPage(){ 36 return "/WEB-INF/jsp/login.jsp"; 37 } 38 39 @RequestMapping("/user/home") 40 public String toUserHome(){ 41 return "/WEB-INF/jsp/userhome.jsp"; 42 } 43 44 @RequestMapping("/logout") 45 public String logout(){ 46 request.getSession().removeAttribute(Global.USER_SESSION_KEY); 47 return "redirect:/"; 48 } 49 50 @RequestMapping(value = "/doLogin", method = RequestMethod.POST) 51 public String doLogin(@RequestParam String userName, @RequestParam String password){ 52 53 try { 54 User user = service.doLogin(userName, password); 55 request.getSession().setAttribute(Global.USER_SESSION_KEY, user); 56 return "redirect:/user/home.html"; 57 } catch (Exception e) { 58 return "/WEB-INF/jsp/login.jsp"; 59 } 60 61 } 62 63 }
当点击用户中心时,触发拦截,相关配置如下
在spring-mvc.xml中加上拦截配置,拦截所有URL中包含/user/的请求,当然请求用户中心时就会触发这个拦截器了
1 <mvc:interceptors> 2 <mvc:interceptor> 3 <!-- 拦截所有URL中包含/user/的请求 --> 4 <mvc:mapping path="/user/**"/> 5 <bean class="com.jikexueyuan.demo.springmvc.lesson4.interceptor.LoginInterceptor"></bean> 6 </mvc:interceptor> 7 </mvc:interceptors>
然后是bean指向的具体的interceptor类,如果session保存的用户信息为null,则跳到login页面,postHandle和afterCompletion方法都不执行,反之都执行。
1 package com.jikexueyuan.demo.springmvc.lesson4.interceptor; 2 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletResponse; 5 6 import org.springframework.web.servlet.HandlerInterceptor; 7 import org.springframework.web.servlet.ModelAndView; 8 9 import com.jikexueyuan.demo.springmvc.lesson4.constant.Global; 10 11 public class LoginInterceptor implements HandlerInterceptor { 12 13 @Override 14 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 15 Object user = request.getSession().getAttribute(Global.USER_SESSION_KEY); 16 if (user == null) { 17 System.out.println("尚未登录,调到登录页面"); 18 response.sendRedirect("/loginpage.html"); 19 return false; 20 } 21 22 return true; 23 } 24 25 @Override 26 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 27 System.out.println("postHandle"); 28 } 29 30 @Override 31 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 32 System.out.println("afterCompletion"); 33 } 34 35 }
至此,简单的springmvc拦截器就完成了。