前言
俗话说做项目是让人成长最快的方案,最近小编写项目的时候遇到了一个小问题。小编在项目中所负责的后台系统,但是后台系统是通过系统的页面是通过ifame联动的,那么这时候问题就来了,后台所做的所有操作都是联动操作(都是基于所联动的)那么我后台所做的所有操作都是基于后台用户登录的情况下所做的。但是在联动中中所有页面都是单独存在的,如果要解决这个问题就需要在做操作之前判断用后台用户是否已经登录。想知道小编是如何实现的那就接着往下看。
简介
Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。
Spring为我们提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以非常方便的实现自己的拦截器。
preHandle在业务处理器处理请求之前被调用。
postHandle在业务处理器处理请求执行完成后,生成视图之前执行。
afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 。
编码实现
在简单了解了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 [email protected] 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 @Override 128 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 @Override 136 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信息。
时间: 2024-10-13 08:24:22