Spring Boot拦截器配置拦截登陆「建议收藏」

Spring Boot拦截器配置拦截登陆「建议收藏」一,pom.xml的配置这里很简单,先引入spring-boot-starter-parent,parent是父模块,由父模块统一进行spring-boot版本管理,dependencies中与spring-boot启动绑定的包不需要再指定版本。<parent><groupId>org.springframework.boot<…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一,pom.xml的配置

    这里很简单,先引入spring-boot-starter-parent,parent 是父模块,由父模块统一进行 spring-boot 版本管理,dependencies 中与 spring-boot 启动绑定的包不需要再指定版本。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.3.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

二,新建WebConfigurer

    1,如图,新建的 config 包,用来装初始化文件,在配置之下新建 WebConfigurer。

Spring Boot拦截器配置拦截登陆「建议收藏」

    2,WebConfigurer需要实现 WebMvcConfigurer 这个接口,并实现里面的两个方法。(在老版本的 spring-boot 中使用的是WebMvcConfigurerAdapter,新版本中已过时!!!还有不能通过继承 WebMvcConfigurationSupport 这个类来实现,这样会在某些情况下失效!!!),第二个 addInterceptors 方法用来注册添加拦截器。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfigurer implements WebMvcConfigurer {

  // 这个方法是用来配置静态资源的,比如html,js,css,等等
  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
  }

  // 这个方法用来注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
  }
}

 

三,新建登陆拦截器

    如下图所示,在 config 包下新建一个 intercepors 包,用来装拦截器。然后在拦截器下新建 LoginInterceptor,用来拦截验证登陆。

Spring Boot拦截器配置拦截登陆「建议收藏」

    2,每一个拦截器有需要实现的 HandlerInterceptor 接口,这个接口有三个方法,每个方法会在请求调用的不同时期完成,因为我们需要在接口调用之前拦截请求判断是否登陆,所以这里需要使用 preHandle 方法,在里面写验证逻辑,最后返回 true 或者 false,确定请求是否合法。记住加 @Component 注解,我们需要在上一步的 WebConfigurer 类中注入。用户是自定义的用户类,大家可以自己定义,我这里就不贴出来了。

import com.impte.study.domain.po.User;
import org.springframework.lang.Nullable;
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 javax.servlet.http.HttpSession;

@Component
public class LoginInterceptor implements HandlerInterceptor {

    //这个方法是在访问接口之前执行的,我们只需要在这里写验证登陆状态的业务逻辑,就可以在用户调用指定接口之前验证登陆状态了
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //每一个项目对于登陆的实现逻辑都有所区别,我这里使用最简单的Session提取User来验证登陆。
        HttpSession session = request.getSession();
        //这里的User是登陆时放入session的
        User user = (User) session.getAttribute("user");
        //如果session中没有user,表示没登陆
        if (user == null){
            //这个方法返回false表示忽略当前请求,如果一个用户调用了需要登陆才能使用的接口,如果他没有登陆这里会直接忽略掉
            //当然你可以利用response给用户返回一些提示信息,告诉他没登陆
            return false;
        }else {
            return true;    //如果session里有user,表示该用户已经登陆,放行,用户即可继续调用自己需要的接口
        }
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

 

四,在WebConfigurer中添加拦截器

    1,首先将 LoginInterceptor 注入到 WebConfigurer 中。

    @Autowired
    private LoginInterceptor loginInterceptor;

    2,然后在 WebConfigurer 中的 addInterceptors 中添加拦截器,使其生效。

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // addPathPatterns("/**") 表示拦截所有的请求,
        // excludePathPatterns("/login", "/register") 表示除了登陆与注册之外,因为登陆注册不需要登陆也可以访问
        registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/login", "/register");
        super.addInterceptors(registry);    //较新Spring Boot的版本中这里可以直接去掉,否则会报错
    }

    3,addPathPatterns 用来设置拦截路径,excludePathPatterns 用来设置白名单,也就是不需要触发这个拦截器的路径。

    完整代码:

import com.impte.study.config.interceptors.LoginInterceptor;
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.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfigurer implements WebMvcConfigurer {

  @Autowired
  private LoginInterceptor loginInterceptor;

  // 这个方法是用来配置静态资源的,比如html,js,css,等等
  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
  }

  // 这个方法用来注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    // addPathPatterns("/**") 表示拦截所有的请求,
    // excludePathPatterns("/login", "/register") 表示除了登陆与注册之外,因为登陆注册不需要登陆也可以访问
    registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/login", "/register");
  }
}

五,总结

    我在这里只是用登陆的例子来展现来展现拦截器的基本使用,拦截器用途很广,比如可以用来进行接口权限控制。如果我的文章对你有帮助,请关注一波,CSDN新人驾到,还望各路大神多多照顾!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/160954.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

  • 5.6 读和写流

    5.6 读和写流

  • 关于java二维数组长度(length)的知识

    关于java二维数组长度(length)的知识二话不说,呈上代码//定义一个整型数组:3行4列inta[][]=newint[3][4];//获取行数—3行intlenY=a.length;//获取列数—4列intlenX=a[0].length;其实很好理解,因为二维数组可以理解为是一维数组,只不过他的各处的元素是特殊元素—–一维数组a[0][0]a[0][1]a[0][2]…

  • JVM内存结构和Java内存模型别再傻傻分不清了

    JVM内存结构和Java内存模型别再傻傻分不清了JVM内存结构和Java内存模型都是面试的热点问题,名字看感觉都差不多,网上有些博客也都把这两个概念混着用,实际上他们之间差别还是挺大的。通俗点说,JVM内存结构是与JVM的内部存储结构相关,而Java内存模型是与多线程编程相关,本文针对这两个总是被混用的概念展开讲解。文章目录JVM内存结构JVM构成JVM内存结构程序计数器虚拟机栈本地方法栈堆方法区GC垃圾回收机制1.垃圾判别方法引用计数算法可达性分析算法2.垃圾回收算法标记清除法标记整理法复制算法3.分代垃圾回收机制4.垃圾回收器5.四种引

  • etl算法详解_数据拉链处理什么意思

    etl算法详解_数据拉链处理什么意思所谓拉链,就是记录历史。记录一个事物从开始,一直到当前状态的所有变化的信息。   在历史表中对客户的一生的记录可能就这样几条记录,避免了按每一天记录客户状态造成的海量存储的问题:(NAME)人名(START-DATE)开始日期(END-DT)结束日期(STAT)状态    client             19000101                       

    2022年10月16日
  • 计算机加密无法连接打印机,0x00000006无法连接打印机怎么办[通俗易懂]

    计算机加密无法连接打印机,0x00000006无法连接打印机怎么办[通俗易懂]0x00000006无法连接打印机怎么办?解决思路一:WIN10作为主机共享的话要设置一下,具体如下,鼠标右击任务栏网络图标,在菜单中左键点击打开网络和共享中心,鼠标左键点击打开窗口的左上角更改高级共享设置,在打开的窗口中,鼠标左键点击所有网络,选择1.公用文件夹(启用)2.文件共享连接使用128位加密3.密码保护的共享(关闭),保存。然后去需要共享的机器:按下键盘左下角的window…

  • FFplay硬件加速[通俗易懂]

    FFplay硬件加速[通俗易懂]本文以ffmpeg-4.4源码为准,a.mp4下载链接:百度网盘,提取码:nl0s。FFplay硬件解码命令如下:ffplay.exe-vcodech264_cuvid-ia.mp4上面命令指定了NVIDIA的硬件解码器,h264_cuvid。在ffplay.c的代码里面硬件解码跟普通解码在逻辑上没有做什么特殊的处理。ffplay.c里面没有像ffmpeg.c那样支持-hwaccel这个选项,所以ffplay.c的硬件解码流程跟普通解码…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号