拦截器怎么把请求终端_如何快速在 Springboot 中集成拦截器? | 原力计划

d76b420b66d323d213bf6d4ebbffe655.gif

e78ea3eceae951d6af06ede1d59c4581.png

作者 | 才疏学浅 责编 | 夕颜 出品 | CSDN(ID:CSDNnews)

话不多说,直接上货!

9afb876d340b83a568247884648e495a.png

拦截器的作用

拦截器提供了一种机制,在访问action前后进行一些操作,因为拦截器的这个特性,那么我们就可以利用拦截器做一些事情,比如监控访问人数,拦截一些非法请求,记录访问日志,身份验证之类的

4fcf3ec9d4e60b47929b7bd0f4cb417a.png

构建拦截器

2.1 创建拦截器

1.创建类实现HandlerInterceptor接口

2.HandlerInterceptor有三种拦截方式

`preHandle` :在访问controller调用之前
`postHandle` :请求访问controller之后,渲染视图之前
`afterCompletion` :请求访问controller之后,渲染视图之后

3.返回值为boolean

  • true: 请求在经过验证校验以后,是OK的,是可以放行的

  • false: 请求被拦截,被驳回,验证出现问题

代码示例:

package com.imooc.interceptor;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.OutputStream;import static com.imooc.controller.BaseController.REDIS_USER_TOKEN;public class UserTokenInterceptor implements HandlerInterceptor {    /**     * 拦截请求,在访问controller调用之前     * @param request     * @param response     * @param handler     * @return     * @throws Exception     */    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        System.out.println("进入拦截器");        /**         * false: 请求被拦截,被驳回,验证出现问题         * true: 请求在经过验证校验以后,是OK的,是可以放行的         */        return true;    }    /**     * 请求访问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 {    }    /**     * 请求访问controller之后,渲染视图之后     * @param request     * @param response     * @param handler     * @param ex     * @throws Exception     */    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {    }}

2.2 注册拦截器

1.创建类实现WebMvcConfigurer接口

2.注册创建的拦截器

@Bean    public UserTokenInterceptor userTokenInterceptor() {        return new UserTokenInterceptor();    }

3.重写addInterceptors 添加监听的路径

  • addPathPatterns 添加监听的路径地址

  • excludePathPatterns 排除一些路径

代码示例:

package com.imooc.config;import com.imooc.interceptor.UserTokenInterceptor;import org.springframework.boot.web.client.RestTemplateBuilder;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.client.RestTemplate;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configurationpublic class WebMvcConfig implements WebMvcConfigurer {    @Bean    public UserTokenInterceptor userTokenInterceptor() {        return new UserTokenInterceptor();    }    /**     * 注册拦截器     * @param registry     */    @Override    public void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(userTokenInterceptor())                .addPathPatterns("/hello")                .addPathPatterns("/shopcart/add")                .addPathPatterns("/shopcart/del")                .addPathPatterns("/address/list")                .addPathPatterns("/address/add")                .addPathPatterns("/address/update")                .addPathPatterns("/address/setDefalut")                .addPathPatterns("/address/delete")                .addPathPatterns("/orders/*")                .addPathPatterns("/center/*")                .addPathPatterns("/userInfo/*")                .addPathPatterns("/myorders/*")                .addPathPatterns("/mycomments/*")                .excludePathPatterns("/myorders/deliver")                .excludePathPatterns("/orders/notifyMerchantOrderPaid");        WebMvcConfigurer.super.addInterceptors(registry);    }}

44a747f61e665a3dd1983349497e00bc.png

拦截器错误信息返回前端

因为拦截器返回的结果是布尔类型的,所有不能直接返回信息,那怎么办呢,我们可以利用output输出流来写入response中,这样前台就可以获取到了。

代码如下:

public void returnErrorResponse(HttpServletResponse response,                                    String result) {        OutputStream out = null;        try {            response.setCharacterEncoding("utf-8");            response.setContentType("text/json");            out = response.getOutputStream();            out.write(result.getBytes("utf-8"));            out.flush();        } catch (IOException e) {            e.printStackTrace();        } finally {            try {                if (out != null) {                    out.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }    }

原文链接:

https://blog.csdn.net/qq_38446413/article/details/105819433

c576b161991b65c2fbcc798bf87e3fca.png

5d5ab4233d1f1988274ee8501bc543e3.png

更多精彩推荐

☞我们想研发一个机器学习框架,6 个月后失败了

☞生产型机器学习已经没那么困难了?

☞视频 | 你不知道的"开源"60年秘史

☞GitHub标星10,000+,Apache项目ShardingSphere的开源之路

☞阿里技术专家告诉你,如何画出优秀的架构图?

☞加拿大API平台如何做到30%为中国明星项目?创业老兵这样说……

ed4e25a0e57b06639558bd7b189c2bf2.png你点的每个“在看”,我都认真当成了喜欢
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值