Springboot 添加拦截器

一、实现拦截器

package com.bxp.controller.interceptor;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

@Component
public class UserTokenInterceptor implements HandlerInterceptor {
    /**
     * 在请求处理之前进行调用(Controller方法调用之前)
     * @param request
     * @param response
     * @param handler
     * @return 返回true才会继续向下执行,返回false取消当前请求
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器被调用");
        // 在拦截器中如果判断条件全部满足,结果返回true没什么大问题,流程正常执行
        // 但是如果判断条件不满足,返回false时,后续所有方法就都不会执行,
        // 但我们在前端页面不能什么内容都不返回,要返回出问题的内容,这时候就需要借助
        // response自身的响应方法,将内容响应给前端了
        boolean condition = false;
        if(condition){
            return condition;
        } else {
            // 使用response将拦截的原因响应给前端
            response.setContentType("text/json");
            response.setCharacterEncoding("UTF-8");
            response.getWriter().print("这里表示请求被拦截,在这里可以返回任何内容,与正常响应一样");
        }
        return false;
    }


    /**
     * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    /**
     * 在整个请求结束之后被调用,DispatcherServlet 渲染视图之后执行(进行资源清理工作)
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

preHandle: 在请求处理之前进行调用(Controller方法调用之前)

                     返回true才会继续向下执行,返回false取消当前请求

postHandle:请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)

afterCompletion:在整个请求结束之后被调用,DispatcherServlet 渲染视图之后执行(进行资源清理工作)

 

在拦截器中如果判断条件全部满足,结果返回true没什么大问题,流程正常执行, 但是如果判断条件不满足,返回false时,后续所有方法就都不会执行, 但我们在前端页面不能什么内容都不返回,要返回出问题的内容,这时候就需要借助response自身的响应方法,将内容响应给前端了。

二、添加拦截器


@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {

    @Autowired
    private UserTokenInterceptor userTokenInterceptor;


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 这里不使用IOC注入的,直接使用构造方法创建也行
        registry.addInterceptor(userTokenInterceptor)
                .addPathPatterns("/index/*").excludePathPatterns("/index/carousel");
        super.addInterceptors(registry);
    }
}

 addPathPatterns方法添加要拦截的地址,*代表所有()

注意:* 和 ** 在使用时是不一样的,*是拦截一层子路径,**是拦截所有子路径,一直到最后一层

/wzxx/*可以拦截/wzxx/list,/wzxx/reply等访问路径,但是无法拦截/wzxx/list/,/wzxx/reply/,前后的路径只相差结尾的/,访问到的内容也完全一样,这种情况拦截器拦截效果很差,用户很容易越过拦截器访问,单个*的情况适合*后边还有其他子路径内容,例如/wzxx/*/item01,用*匹配一层路径的情况。

/wzxx/**可以拦截/wzxx/list,/wzxx/reply等访问路径,**代表拦截/wzxx开始的任意路径,不论后边有什么内容。

excludePathPatterns方法要排除那些地址,比如使用addPathPatterns("/index/*")拦截所有的index开头的地址,使用excludePathPatterns("/index/carousel")表示/index/carousel这个地址不在拦截方位内,排除拦截。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值