拦截器的概述
- SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术。
- 可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。
- 拦截器和过滤器的功能比较类似,有区别
- 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。
- 拦截器是SpringMVC框架独有的。
- 过滤器配置了/*,可以拦截任何资源。
- 拦截器只会对控制器中的方法进行拦截。
- 拦截器也是AOP思想的一种实现方式
- 想要自定义拦截器,需要实现HandlerInterceptor接口。
自定义拦截器步骤
- 创建类,实现HandlerInterceptor接口,重写需要的方法
package com.hadwinling.interceptors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
import com.hadwinling.entity.User;
public class LoginInterceptor implements HandlerInterceptor{
/**
* 拦截器 拦截的是进入控制器的方法
preHandle,在进入控制器方法前处理操作
boolean:true 放行
false 不放行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("进入拦截器,进行登陆验证");
String uri = request.getRequestURI();
if (uri.indexOf("/login")>0) {
//请求路径中包含 /login 放行
//放行登录请求
return true;
}
HttpSession session = request.getSession();
User user = (User)session.getAttribute("currUser");
if (user!=null) {
//已登陆
return true;
}
//未登录
String basepath = request.getServletContext().getContextPath();
response.sendRedirect(basepath+"/login.jsp");
return false;
}
}
在 springmvc.xml 配置拦截器需要拦截哪些控制器
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.hadwinling.interceptors.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>