SpringBoot中使用拦截器

回顾SpringMVC使用拦截器步骤

https://www.cnblogs.com/mengd/p/13538396.html

一、Spring Boot 使用拦截器步骤

1. 创建一个SpringBoot 框架 Web 项目

2. 创建model

用户信息

package com.md.springboot.model;

/**
 * @author MD
 * @create 2020-08-22 15:38
 */
public class User {

    private Integer id;

    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

3. 实现一个登录拦截器

在包com.md.springboot.interceptor下

package com.md.springboot.interceptor;

import com.md.springboot.model.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

/**
 * @author MD
 * @create 2020-08-22 15:35
 */
public class UserInterceptor implements HandlerInterceptor { // 快捷键ctrl+O 实现这三个方法


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 业务拦截的规则

        // 从session中获取用户的信息
        User user = (User)request.getSession().getAttribute("user");

        // 判断用户是否登陆
        if (null == user){
            // 未登陆

            response.sendRedirect(request.getContextPath()+"/user/error");
            return false;

        }


        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 {

    }
}

4. 创建一个控制层

package com.md.springboot.web;

import com.md.springboot.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;

/**
 * @author MD
 * @create 2020-08-22 15:50
 */

@Controller
@RequestMapping(value = "/user")
public class UserController {


    //    用户不登陆也能访问
    @RequestMapping(value = "/login")
    @ResponseBody
    public Object login(HttpServletRequest request){
        // 将用户信息存放到session中
        User user = new User();
        user.setId(1001);
        user.setName("pony");
        request.getSession().setAttribute("user",user);

        return "login success";
    }



//    用户登陆才能访问
    @RequestMapping(value = "/center")
    public @ResponseBody Object center(){
        return "You see center";
    }




    //    用户不登陆也能访问
    @RequestMapping(value = "/out")
    public @ResponseBody Object out(){
        return "You look outside";
    }



    //    用户不登陆也能访问
    //  用户未登陆访问了需要登陆的页面
    @RequestMapping(value = "/error")
    public @ResponseBody Object error(){
        return "error";
    }

}

5. @Configuration 定义配置类- 拦截器

在 项 目 中 创 建 一 个 config 包 , 创 建 一 个 配 置 类 InterceptorConfig , 并 实 现WebMvcConfigurer 接口, 覆盖接口中的 addInterceptors 方法,并为该配置类添加@Configuration 注解,标注此类为一个配置类,让 Spring Boot 扫描到,这里的操作就相当于 SpringMVC 的注册拦截器 ,@Configuration 就相当于一个 applicationContext-mvc.xml

重点看注释

实际中拦截地址不必这么麻烦,这里演示多种形式

package com.md.springboot.config;

import com.md.springboot.interceptor.UserInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author MD
 * @create 2020-08-22 15:42
 */
 // 定义此类为配置类(相当于之前的xml配置文件)
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {


    // mvc:interceptors
    @Override
    public void addInterceptors(InterceptorRegistry registry) {


        // 拦截user下的所有访问请求,必须用户登陆才可访问
        // 但这样的话就全部拦截了,有一些请求是不需要拦截的
        String[] addPathPatterns = {
                "/user/**"
        };

        // 排除拦截的地址,也就是用户不登陆也能访问的路径
        String[] excludePathPatterns = {
                "/user/out","/user/login" , "/user/error"
        };


        // mvc:interceptor
        // 传入自定义的拦截器,以及拦截地址
        registry.addInterceptor(new UserInterceptor()).addPathPatterns(addPathPatterns).excludePathPatterns(excludePathPatterns);

    }
}

6. 测试

首先访问不登陆也能访问的页面

然后访问必须登陆之后才能看到的页面,会自动跳转到error页面

进行登陆

登陆成功之后再访问

作者:山丘!

-------------------------------------------

你闻讯而来,我大喜过望,我在这等你,你又在哪呢?喜欢的话加一个“关注”呗!

如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

原文地址:https://www.cnblogs.com/mengd/p/14612369.html