今日工作:由于大半天的课设,时间不是很充裕,学习完成了使用Spring MVC实现的登录验证。
什么是SpringMVC拦截器?
SpringMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于对请求进行拦截和处理。
是使用面向切面(AOP)的一处用途。
常见应用场景:
1、权限检查:如检测请求是否具有登录权限,如果没有直接返回到登陆页面。
2、性能监控:用请求处理前和请求处理后的时间差计算整个请求响应完成所消耗的时间。
3、日志记录:可以记录请求信息的日志,以便进行信息监控、信息统计等。
简单上手:
1、建立一个拦截器实现HandlerInterceptor接口
package com.my.interceptors;
import com.my.dto.StaffDTO;
import com.my.prosonalmanagment.staff.entity.Staff;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginInterceptors implements HandlerInterceptor {
private Logger logger = Logger.getLogger(this.getClass());
/**
* Handler 执行之前调用该方法
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
// 获取请求地址
String url = httpServletRequest.getRequestURI();
if (url.indexOf("login.do") > 0) {
return true;
}
// 判断Session
HttpSession session = httpServletRequest.getSession();
StaffDTO staff = (StaffDTO)session.getAttribute("user");
if (staff != null) {
logger.info("用户已经登录!");
return true;
}
// 不符合条件的直接,跳向登录界面
logger.info("用户未登录!");
httpServletRequest.getRequestDispatcher("/web/login.html").forward(httpServletRequest, httpServletResponse);
return false;
}
/**
* 视图返回之前调用
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
/**
* Handler调用之后执行
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @param e
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
2、配置文件
<!--配置拦截器-->
<mvc:interceptors>
<!--多个拦截器顺序执行-->
<mvc:interceptor>
<mvc:mapping path="/**"/> 拦截全局
<bean class="com.my.interceptors.LoginInterceptors"></bean>
</mvc:interceptor>
</mvc:interceptors>
这样一个基于全局的拦截器就可以使用了,所有的请求拦截都可以自己修改规则,根据需求,可以在里面加入很多处理。
执行顺序
1、单个实现类的执行顺序preHandler -> Controller -> postHandler -> model渲染-> afterCompletion
2、多个实现类的执行顺序
———————preHandler1——————-———————preHandler2——————-
———————preHandler3——————-
———————–Controller———————
———————postHandler3——————
———————postHandler2——————
———————postHandler1——————
——————afterCompletion3—————-
——————afterCompletion2—————-
——————afterCompletion1—————-
问题及解决:在应用到自己的项目中的时候,一开始没有配置配置文件,一直出不来效果,后面加上
了配置文件,发现类型转换错误,我放入session的是StaffDTO,我却转成Staff,经过错误栈打印,
很快定位到错误位置。
明日计划:明日计划熟悉自己的开发平台,快速的构件好一个应用程序。