我们实际中会有这样的需求,当我们浏览页面时,有些信息必须在登录后才可以看到,如果你直接访问那些需要用户登录后才可以看到的url,会自动返回登录界面让你登录,这里我们使用拦截器来实现这种功能
一.自定义拦截器
- 自定义的话,就要实现HandlerInterceptor接口
- 第一步书写类Myintercepter实现类:
- 这里需要注意几点
第一点 | 实现的接口没有实现方法,需要我们自己写 |
---|---|
请求处理前的方法 | public boolean preHandle(){} |
请求处理后的方法 | public void postHandle(){} |
请求提交后的方法 | public void afterCompletion(){} |
第二点 | 上面三个方法的执行顺序就是从上到下 |
package com.offcn.intercepter;
import com.sun.javafx.geom.transform.GeneralTransform3D;
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 Myintercepter implements HandlerInterceptor {
@Override
//预处理:请求处理前
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler){
//1.获取session中存储的用户信息
HttpSession session=request.getSession();
//2.判断用户输入的请求路径是否包含需要登录才可以浏览的路径
if (request.getRequestURI().indexOf("main")>0){
//3.判断用户是否登录,这里简单使用一个字符串来当做用户信息
if (session.getAttribute("name")!=null){
//此时说明用户登录了,可以放行,让其访问这个url
return true;
} else {
//否则拦截下来
return false;
}
}
//返回值代表是否放行
return true;
}
@Override
//后处理:请求处理后
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
System.out.println("postHandle方法执行");
}
@Override
//后处理:请求提交后
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("afterCompletion方法执行");
}
}
- 写完之后就需要往容器中添加
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.offcn.intercepter.Myintercepter"></bean>
</mvc:interceptor>
</mvc:interceptors>
二.拦截器链的设置
- 上面我们说过拦截器是可以有很多的,而拦截器可以组成拦截器链,这样可以层层进行筛选拦截
- 第一步,书写两个拦截器实现类Myintercepter1和Myintercepter2
package com.offcn.intercepter;
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 Myintercepter1 implements HandlerInterceptor {
@Override
//预处理:请求处理前
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler){
System.out.println("拦截器1的prehandle方法");
return true;
}
@Override
//后处理:请求处理后
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
System.out.println("拦截器1的postHandle方法执行");
}
@Override
//后处理:请求提交后
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("拦截器1的afterCompletion方法执行");
}
}
package com.offcn.intercepter;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Myintercepter2 implements HandlerInterceptor {
@Override
//预处理:请求处理前
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler){
System.out.println("拦截器2的prehandle方法");
return true;
}
@Override
//后处理:请求处理后
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
System.out.println("拦截器2的postHandle方法执行");
}
@Override
//后处理:请求提交后
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("拦截器2的afterCompletion方法执行");
}
}
- 第二步:去容器中配置:
- 查看执行顺序: