EDUCODER头哥 SpringBoot 拦截器

极速版

第1关:自定义拦截器

  • demo/src/main/java/net/educoder/conf/Step1Interceptor.java
  • package net.educoder.conf;
    
    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 Step1Interceptor implements HandlerInterceptor {
    
        /**
         * 需求:过滤掉 URI 为 /taobao/* 的所有请求
         * <p>
         * 例如:
         * 浏览器访问 localhost:8080/taobao/index  --> 过滤掉
         * 浏览器访问 localhost:8080/taobao/home   --> 过滤掉
         */
    
    
        /********** begin **********/
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            if(request.getRequestURI().equals("/taobao/index") || request.getRequestURI().equals("/taobao/home")){
                return false;
            }else{
                return true;
            }
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            
        }
    
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
        }
    
         /********** end **********/
    }
    

  • demo/src/main/java/net/educoder/conf/WebConfig.java
  • package net.educoder.conf;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    /********** begin **********/
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        @Autowired
        Step1Interceptor step1Interceptor;
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(step1Interceptor).addPathPatterns("/**");
        }
    }
    
    /********** end **********/

    第2关:token 认证拦截器

  • demo2/src/main/java/net/educoder/conf/Step2Interceptor.java
  • package net.educoder.conf;
    
    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;
    import java.util.Arrays;
    import java.util.List;
    
    @Component
    public class Step2Interceptor implements HandlerInterceptor {
    
        /**
         * 需求: 拦截 URI 为 /home 的请求,如果符合以下要求则放行
         *
         * 放行要求:
         *      请求头中包含 user-token 并且请求头的 user-token 的值在 tokenList 中
         * <
         * 不符合要求:
         *       通过 response 将页面重定向到 /login 页面
         */
    
        private List<String> tokenList = Arrays.asList("22854D7A00FDB48AC4130380AE67B2F7", "11354E7A00FDB48AC4130380AE67B2F7");
    
        /********** begin **********/
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
           String Token = request.getHeader("user-token");
            if (Token != null && tokenList.contains(Token)){
                return true;
           }else{
                response.sendRedirect("/login");
                return false;
           }
        }
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
        }
    
         /********** end **********/
    }
    

  • demo2/src/main/java/net/educoder/conf/WebConfig.java
  • package net.educoder.conf;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    
    /********** begin **********/
    
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
    
        @Autowired
        Step2Interceptor step2Interceptor;
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(step2Interceptor).addPathPatterns("/home");
        }
    }
    
    /********** end **********/


以下是题目

第1关:自定义拦截器

任务描述
本关任务:自定义拦截器完成 URI 的拦截

相关知识
为了完成本关任务,你需要掌握:如何自定义拦截器

拦截器(Interceptor)
拦截器(Interceptor)是 AOP 的一种实现,它能对 Controller 层的方法前后进行拦截处理。

简单地来说就是对一些请求进行拦截,比如说:用户主页这个页面必须在用户登录之后才能进行访问的,如果我们不使用拦截器的话,那么用户就能进行访问到用户页面,在实际情况下,用户访问的页面都是有限的,为什么这么说呢?

因为用户访问的页面是跟用户的权限直接挂钩的,比如说用户A是管理员、用户B是普通用户,他两货访问的页面范围是不同的,用户A除了可以访问用户B能访问的页面还能访问只属于管理员能访问的页面。这个页面访问的权限控制就可以通过拦截器来实现。

上面介绍了什么是拦截器,接下来就是怎么使用拦截器了?

拦截器的使用步骤有两个步骤

定义拦截器组件,就是创建一个类实现 HandlerInterceptor 接口

注册拦截器,就是创建一个配置类实现 WebMvcConfigurer 接口,然后将拦截器组件与 InterceptorRegistry 进行绑定,设置拦截范围

案例代码如下:

拦截器组件

@Component
public class Step1Interceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("进入controller层之前拦截请求");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("处理请求完成后视图渲染之前的处理操作");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("视图渲染之后的操作");
    }
}
拦截器配置类

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Resource
    Step1Interceptor step1Interceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 自定义拦截器,添加拦截路径和排除拦截路径
        registry.addInterceptor(step1Interceptor).addPathPatterns("/**");
    }
}
Controller类

@Controller
public class MainController {
    @RequestMapping("/index")
    @ResponseBody
    public String index() {
        System.out.println("Controller 处理逻辑");
        return "INDEX";
    }
}
浏览器访问:localhost:8080/index

控制台输出

进入controller层之前拦截请求
Controller 处理逻辑
处理请求完成后视图渲染之前的处理操作
视图渲染之后的操作
HandlerInterceptor 类详解
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception;
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception;
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception;
preHandle:进入controller层之前拦截请求,返回 true 进行下一步处理,返回 false 不进行下一步处理(也就是说拦截了)。预处理,可以进行编码、安全控制、权限校验等处理;

postHandle:处理请求完成后视图渲染之前的处理操作。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView;

afterCompletion:视图渲染之后的操作,可用于清理资源等。返回处理(已经渲染了页面);

编程要求
根据提示,在右侧编辑器补充代码,完成以下需求:

测试说明
平台会对你编写的代码进行测试,会通过发起 HTTP 请求,访问以下 URL 来判断是否拦截成功

localhost:8080/JD/index

localhost:8080/JD/home

localhost:8080/taobao/index

localhost:8080/taobao/home


第2关:token 认证拦截器

任务描述
本关任务:编写一个 token 认证拦截器

编程要求
根据提示,在右侧编辑器补充代码,完成以下需求:

拦截 URI 为 /home 的请求,如果符合以下要求则放行

放行要求: 请求头中包含 user-token 并且请求头的 user-token 的值在 tokenList 中

不符合要求:通过 response 将页面重定向到 /login 页面

测试说明
平台会对你编写的代码进行测试,会通过发起 HTTP 请求,访问以下 URL 来判断是否拦截成功

localhost:8080/home
查看效果页面默认的路由为 /home

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值