首页 > 代码库 > SpringMvc拦截器小测试

SpringMvc拦截器小测试

前言 

俗话说做项目是让人成长最快的方案,最近小编写项目的时候遇到了一个小问题。小编在项目中所负责的后台系统,但是后台系统是通过系统的页面是通过ifame联动的,那么这时候问题就来了,后台所做的所有操作都是联动操作(都是基于所联动的)那么我后台所做的所有操作都是基于后台用户登录的情况下所做的。但是在联动中中所有页面都是单独存在的,如果要解决这个问题就需要在做操作之前判断用后台用户是否已经登录。想知道小编是如何实现的那就接着往下看。

简介

Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。 
Spring为我们提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以非常方便的实现自己的拦截器。

preHandle在业务处理器处理请求之前被调用。

postHandle在业务处理器处理请求执行完成后,生成视图之前执行。

afterCompletionDispatcherServlet完全处理完请求后被调用,可用于清理资源等 。

编码实现

在简单了解了HandlerInterceptorAdapter之后,我们来测试一发。

 

  1 package com.laifuu.interceptor;  2   3    4   5 import java.io.IOException;  6   7 import javax.servlet.http.HttpServletRequest;  8   9 import javax.servlet.http.HttpServletResponse; 10  11 import org.apache.log4j.Logger; 12  13 import org.springframework.web.servlet.ModelAndView; 14  15 import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 16  17 import com.laifuu.comm.utils.ExceptionUtils; 18  19 import com.laifuu.entity.User; 20  21   22  23 /**    24  25  * @Title: 登陆拦截器 26  27  * @Description: TODO 28  29  * Company:www.hack-gov.com 30  31  * @author: 0nise   32  33  * @date: 2017-2-19 上午12:18:19 34  35  * @Email woo0nise@gmail.com 36  37  * @version: V1.0    38  39  */ 40  41 public class LoginInterceptor extends HandlerInterceptorAdapter { 42  43   44  45 private static Logger logger = Logger.getLogger(LoginInterceptor.class); 46  47 // 白名单URL 48  49 private static final String[] IGNORE_URI = {"/login.jsp", "/checkAdminLogin.action","/getVerifyCode.action","/checkVerifyCode.action","/adminLogin.action"}; 50  51   52  53 /* (non Javadoc) 54  55  * @Title: 拦截器 56  57  * @Description: TODO 58  59  * @param request 60  61  * @param response 62  63  * @param handler 64  65  * @return 66  67  * @see org.springframework.web.servlet.handler.HandlerInterceptorAdapter#preHandle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object) 68  69  */ 70  71 @Override 72  73 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){ 74  75 boolean flag = false; 76  77 String url = request.getRequestURI(); 78  79 // 判断请求路径是否白名单中路径 80  81 for (String s : IGNORE_URI) { 82  83 if(url.contains(s)){ 84  85 flag = true; 86  87 break; 88  89 } 90  91 } 92  93 if(!flag){ 94  95 User user = (User)request.getSession().getAttribute("adminUser"); 96  97 if(user != null){ 98  99 flag = true;100 101 }102 103 }104 105 try {106 107 // 如果用户访问的路径不存在并且没有登陆,重定向到登陆页面108 109 response.sendRedirect("/login.jsp");110 111 } catch (IOException e) {112 113 e.printStackTrace();114 115 //日志记录116 117 logger.error(ExceptionUtils.getStackTrace(e));118 119 }120 121 return flag;122 123 }124 125  126 127     @Override128 129     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {130 131         super.postHandle(request, response, handler, modelAndView);132 133 }134 135  @Override136 137  public void afterCompletion(HttpServletRequest request,138 139          HttpServletResponse response, Object handler, Exception ex)140 141          throws Exception {142 143   }144 145 }

 

 

 

在代码中设置了URL访问白名单,例如对登录action或者验证码生成以及验证。

写好代码之后我们还需要在spring mvc配置中进行配置拦截器

 

<!-- 配置拦截器 --><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><bean id="loginInterceptor" class="com.laifuu.interceptor.LoginInterceptor" ></bean></mvc:interceptor></mvc:interceptors>

 

然后就没有然后了,在进行出了白名单中的action或者url请求时放行其他全部都需要获取用户session信息。

SpringMvc拦截器小测试