前言
俗话说做项目是让人成长最快的方案,最近小编写项目的时候遇到了一个小问题。小编在项目中所负责的后台系统,但是后台系统是通过系统的页面是通过ifame联动的,那么这时候问题就来了,后台所做的所有操作都是联动操作(都是基于所联动的)那么我后台所做的所有操作都是基于后台用户登录的情况下所做的。但是在联动中中所有页面都是单独存在的,如果要解决这个问题就需要在做操作之前判断用后台用户是否已经登录。想知道小编是如何实现的那就接着往下看。
简介
Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。
Spring为我们提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以非常方便的实现自己的拦截器。
preHandle在业务处理器处理请求之前被调用。
postHandle在业务处理器处理请求执行完成后,生成视图之前执行。
afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 。
编码实现
在简单了解了HandlerInterceptorAdapter之后,我们来测试一发。
package com.laifuu.interceptor; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import com.laifuu.comm.utils.ExceptionUtils; import com.laifuu.entity.User; /** * @Title: 登陆拦截器 * @Description: TODO * Company:www.hack-gov.com * @author: 0nise * @date: 2017-2-19 上午12:18:19 * @Email woo0nise@gmail.com * @version: V1.0 */ public class LoginInterceptor extends HandlerInterceptorAdapter { private static Logger logger = Logger.getLogger(LoginInterceptor.class); // 白名单URL private static final String[] IGNORE_URI = {"/login.jsp", "/checkAdminLogin.action","/getVerifyCode.action","/checkVerifyCode.action","/adminLogin.action"}; /* (non Javadoc) * @Title: 拦截器 * @Description: TODO * @param request * @param response * @param handler * @return * @see org.springframework.web.servlet.handler.HandlerInterceptorAdapter#preHandle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object) */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){ boolean flag = false; String url = request.getRequestURI(); // 判断请求路径是否白名单中路径 for (String s : IGNORE_URI) { if(url.contains(s)){ flag = true; break; } } if(!flag){ User user = (User)request.getSession().getAttribute("adminUser"); if(user != null){ flag = true; } } try { // 如果用户访问的路径不存在并且没有登陆,重定向到登陆页面 response.sendRedirect("/login.jsp"); } catch (IOException e) { e.printStackTrace(); //日志记录 logger.error(ExceptionUtils.getStackTrace(e)); } return flag; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { super.postHandle(request, response, handler, modelAndView); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
在代码中设置了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信息。