页面访问拦截器
拦截器:拦截浏览器发送的请求。
很多页面我们都希望登录用户才可以访问,非登录用户则拒绝访问,这时就需要拦截器来处理请求。
自定义拦截器
新建MyHandlerInterceptor类实现HandlerInterceptor接口来定义自己的拦截器。
public class MyHandlerInterceptor implements HandlerInterceptor{
private static Logger log=LoggerFactory.getLogger(MyHandlerInterceptor.class);
/**
* 存储不拦截路径
*/
private static final String[] IGNORE_URI = {"/index","/imagecode"};
//在请求处理之前进行调用(Controller方法调用之前)
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
log.info("请求开始,判断是否需要拦截");
boolean flag=false;
String servletPath=req.getServletPath();
log.info("请求路径:"+servletPath);
//遍历数组确定该路径是否需要拦截
for(String str:IGNORE_URI){
if(servletPath.contains(str)){
flag=true;
log.info("该请求不需要拦截!");
}
}
//拦截请求
if(!flag){
//获取session中存储的用户信息
user user = (user) req.getSession().getAttribute("user");
if(user==null){
log.info("用户未登录,返回登录页面!");
// 服务器内部转发,可以带回request
req.getRequestDispatcher("/index").forward(req, resp);//拦截器的生命周期就已经结束,不会再向下执行
}else{
log.info("获取session中存储的用户信息:"+user.toString());
flag=true;
}
}
return flag;// 只有返回true才会继续向下执行,返回false取消当前请求
}
//请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
log.info("请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
}
//在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
log.info("在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
}
}
配置拦截器
新建配置类MyWebMvcCofig继承WebMvcConfigurerAdapter,然后重写addInterceptors方法
@Configuration
public class MyWebMvcCofig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//拦截规则:除了index,其他都拦截判断
// addPathPatterns 用于添加拦截规则
// excludePathPatterns 用户排除拦截
registry.addInterceptor(new MyHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/index");
}
}
栗子
不拦截请求实例
拦截请求实例
登录之后再次访问