java拦截器配置

文章目录

  • 简介
  • 一、拦截器介绍
    • 1.拦截器属性
    • 2.拦截器特点
  • 二、引入拦截器
    • 1.拦截器实现方法
    • 2.读入数据
  • 三、测试拦截器效果
    • 1.新增一个控制器
    • 2.运行项目


简介

拦截器通常用于拦截客户端请求,判断访问条件是否符合预期并做出判断,加入拦截器需要两步,实现拦截器方法和配置拦截器类


提示:以下是本篇文章正文内容,下面案例可供参考

一、拦截器介绍

1.拦截器属性

(1)在action生命周期内拦截器可以被调用多次
(2)不依赖servlet容器
(3)只对action请求使用
(4)拦截器可以注入bean,如在拦截器方法类调用service方法

2.拦截器特点

(1)请求进入controller之前进入拦截器,经过controller之后也进入拦截器
(2)终止客户端不符合条件的请求

二、引入拦截器

1.拦截器实现方法

新建一个InterceptImplementation类,并继承HandlerInterceptor接口,当有请求时,首先进入preHandle方法体,当此方法体当返回为true时,请求放行,返回为fales时请求被拦截,这就是拦截器的核心功能

import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class InterceptImplementation implements HandlerInterceptor {
    long start = System.currentTimeMillis();
    //preHandle是在请求执行前执行的
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        start = System.currentTimeMillis();
        String name=request.getParameter("name");
        if (name.equals("张三"))
        {
            System.out.println("请求放行");
            return true;
        }
        else
        {
            System.out.println("请求被拦截");
            return false;
        }
       //返回true即可放行请求
    }

    //postHandler是在请求结束之后,视图渲染之前执行的,但只有preHandle方法返回true的时候才会执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
        System.out.println("Interception cost="+(System.currentTimeMillis()-start));
    }

    //afterCompletion是视图渲染完成之后才执行,同样需要preHandle返回true,
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        System.out.println("Interception cost="+(System.currentTimeMillis()-start));
        //该方法通常用于清理资源等工作
    }
}

代码如下(示例):

2.读入数据

有了实现类,还需对拦截器进行配置,首先新建InterceptConfig类并注解@Configuration,说明是配置类,再继承WebMvcConfigurationSupport类,然后拦截器就配置完毕了

import com.example.handlerinterceptor.handlerinterceptor.InterceptImplementation;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class InterceptConfig extends WebMvcConfigurationSupport {
    /**
     * 静态资源配置
     */
    /*@Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/img/**")
                .addResourceLocations("classpath:/imgs/");

        super.addResourceHandlers(registry);
    }*/

    /**
     * 默认首页配置
     */
//    @Override
//    public void addViewControllers(ViewControllerRegistry registry) {
//        registry.addViewController("/").setViewName("forward:/index");
//        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
//        super.addViewControllers(registry);
//    }

    /**
     * interceptor配置
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new InterceptImplementation())
                //添加需要验证登录用户操作权限的请求
                .addPathPatterns("/**")
                //这里add为“/**”,下面的exclude才起作用,且不管controller层是否有匹配客户端请求,拦截器都起作用拦截
//                .addPathPatterns("/hello")
                //如果add为具体的匹配如“/hello”,下面的exclude不起作用,且controller层不匹配客户端请求时拦截器不起作用

                //排除不需要验证登录用户操作权限的请求
                .excludePathPatterns("/wang")
                .excludePathPatterns("/css/**")
                .excludePathPatterns("/js/**")
                .excludePathPatterns("/images/**");
        //这里可以用registry.addInterceptor添加多个拦截器实例,后面加上匹配模式
        super.addInterceptors(registry);//最后将register往这里塞进去就可以了
    }
}

三、测试拦截器效果

1.新增一个控制器

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @RequestMapping("/test2")
    public String Test()
    {
        return "123";
    }
}

2.运行项目

首先运行项目,打开浏览器输入网址http://localhost:8080/test2?name=张三
java拦截器配置_第1张图片
浏览器输入网址http://localhost:8080/test2?name=李四访问结果如下,请求不满足预设条件被拦截了
java拦截器配置_第2张图片

你可能感兴趣的:(spring,boot,java,interceptor,spring)