文章目录
一、前言:
当用到强制登陆操作时,要用到拦截器,下面介绍一下 HandlerInterceptor接口中三个方法
二、实现方法过程:
创建类实现HandlerInterceptor接口之后,jdk1.8之前如果没有实现三个preHandle、postHandle、afterHadnle方法会报错,由于jdk1.8的新特性,这里不会报错,需要手动实现三个方法,
idea快捷键:Alt+Inset,点击Implements Methods
选中三个方法,点击ok,即可手动实现三个方法;
三、三个方法介绍
public boolean preHandle
调用时间: Controller方法处理之前【也就是路径跳转之前】;
执行顺序: 链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行;
返回值: 返回值为true,则继续执行,false中断执行,生成时默认false;
应用场景: 常用于强制登陆等操作
public void postHandle
调用前提: preHandle返回true;
调用时间: Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作
执行顺序: 链式Intercepter情况下,Intercepter按照声明的顺序倒着执行。
备注: postHandle虽然post打头,但post、get方法都能处理
public void afterCompletion
调用前提:preHandle返回true
调用时间:DispatcherServlet进行视图的渲染之后
应用场景:多用于清理资源,统一日志处理,统一异常处理
代码如下:
//拦截器
public class MyHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return false;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
粘上强制登陆的代码,仅供参考:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
Object flag = session.getAttribute("flag");//获取登陆时存放入session作用域中的标识flag
if(flag!=null){ //flag不为空,说明登陆成功
return true;
}else { //flag为空,说明登陆失败,跳转到登陆页面
response.sendRedirect(request.getContextPath()+"/login.jsp");
return false;
}
}
四、拦截器的配置:
使用HandlerInterceptor拦截器需要在springMVC-servlet.xml中配置如下:
<!--强制登陆拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/> <!-- xml文件里 '/**'表示拦截所有请求路径 -->
<!--不拦截如下路径:-->
<!-- 不拦截1-登陆-->
<mvc:exclude-mapping path="/manager/selectByName.do"/>
<!--不拦截2-注册-->
<mvc:exclude-mapping path="/manager/insert.do"/>
<!--不拦截3-验证码Controller-->
<mvc:exclude-mapping path="/manager/validateCode.do"/>
<bean class="com.xxx.util.MyHandlerInterceptor"/> <!--根据自己的MyHandlerInterceptor类位置修改 -->
</mvc:interceptor>
</mvc:interceptors>
在pom.xml文件里导入依赖:
<!--hutool 用于生成验证码-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.1</version>
</dependency>
准备工作就绪,接着就可以愉快使用拦截器了~