Spring MVC 拦截器

这篇具有很好参考价值的文章主要介绍了Spring MVC 拦截器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如何实现session共享问题:

1、session都在内存里面存储的,只要有session对象我都分发出去,让其他应用都可以拿到(同步)

缺点:只要有session对象都要广播出去,而且用户应用比较多了就会导致服务压力大,

2、使用token,登录完之后给你一个token,然后加密完之后发给服务器,用的时候直接把token给带过来即可,别的应用调用的时候就会拿到token相应的信息,这样就解决了session共享问题。

Spring MVC 的拦截器(Interceptor)与 Java Servlet 的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。

1.1 拦截器的定义

在 Spring MVC 框架中定义一个拦截器需要对拦截器进行定义和配置,

定义一个拦截器可以通过两种方式:

  • 一种是通过实现 HandlerInterceptor 接口实现类来定义;
  • 一种是通过实现 WebRequestInterceptor 接口继承 WebRequestInterceptor 接口的实现类来定义

代码编辑在interceptor包下创建

public class TokenInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, 
                HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle方法处理控制器(controller)方法调用之前");
        String token=request.getParameter("token");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, 
                 Object handler, ModelAndView modelAndView) throws Exception {
  System.out.println("preHandle方法处理控制器(controller)方法调用之后,在解析视图之前执行");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
                     Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion在视图渲染之后执行");
    }
}

配置类里面配置拦截器

@EnableWebMvc
@Configuration
public class WebConfig  implements  WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
      registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/**");
    }

对token进行验证判断:

 @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle方法处理控制器(controller)方法调用之前");
        String token=request.getParameter("token");
        //对token进行判断
        if(token !=null && token.equals("206")){
            return true;
        }
        System.out.println("不是206学员");
        return false;
    }

访问测试:http://localhost:8080/gff/mother?token=206

如果被拦截了,是不是要给一个响应信息,或错误信息。

另外jwt里面也介绍说明:需要放到请求头里面

JWT跨域认证解决方案_赵同学&的博客-CSDN博客

运行测试:

除了返回状态码还可以指定放回格式:

@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle方法处理控制器(controller)方法调用之前");
        //获取请求头 getheader
        String token=request.getHeader("token");
        if(token !=null && token.equals("206")){
            return true;
        }
        System.out.println("不是正牌男友");
        //错误状态码
       // onse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        //指定返回格式
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write("{\"code\":401,\"message\":\"token必须传入\"}");
        return false;
    }

如果第一个拦截器出现问题了怎么办? 可以在添加一个:新创建一个SexInterceptor

public class SexInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle方法处理控制器(controller)方法调用之前");
        String token=request.getParameter("sex");
        if(token !=null && token.equals("girl")){
            return true;
        }
        System.out.println("什么玩意");
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        return false;
    }

配置类配置:多拦截配置

@Override
    public void addInterceptors(InterceptorRegistry registry) {
        //order值越小越先执行
        registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/**");
        registry.addInterceptor(new SexInterceptor()).addPathPatterns("/**");
    }

使用order调整顺序: order值越小越先执行

@Override
    public void addInterceptors(InterceptorRegistry registry) {
        //order值越小越先执行
        registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/**").order(2);
        registry.addInterceptor(new SexInterceptor()).addPathPatterns("/**").order(1);
    }

放行验证:创建一个controller:

@RestController
@RequestMapping("/glf")
public class GirlFriendController {
​
    @GetMapping("/old")
    public String select(){
​
        return "这是你们前女友";
    }

比如针对性拦截:api路径 

@Override
    public void addInterceptors(InterceptorRegistry registry) {
        //order值越小越先执行
     registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/api/**").order(2);
​
    }
public class TokenInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle方法在HandlerMethod执行之前");

        //获取token
        String token = request.getHeader("token");
        //如果token不为空,进行token验证
        if (token.equals("123456")) {
                return true;
            }
        //没有token,直接返回401
      //  response.setStatus(401);
        //或者
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write("{\"code\":401,\"message\":\"token必需传\"}");
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle方法在HandlerMethod调用之后,解析视图之前执行");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion方法在视图渲染结束之后执行");
    }
}

  在上述拦截器的定义中实现了 HandlerInterceptor 接口,并实现了接口中的 3 个方法。有关这 3 个方法的描述如下。

  • preHandle 方法:该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。

  • postHandle 方法:该方法在控制器的处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改。

  • afterCompletion 方法:该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作。文章来源地址https://www.toymoban.com/news/detail-551169.html

1.2 配置代码

@Configuration
//开启 Spring MVC注解驱动
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 可添加多个
         // order 谁小谁先拦截
        registry.addInterceptor(new TokenIntercepter()).addPathPatterns("/**").order(2);
        registry.addInterceptor(new SexIntercepter()).addPathPatterns("/**").order(1);
    }
    /**
     * 视图配置
     */
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        WebMvcConfigurer.super.configureViewResolvers(registry);
        registry.viewResolver(resourceViewResolver());
        /*registry.jsp("/WEB-INF/jsp/",".jsp");*/
    }

    /**
     * 配置请求视图映射
     */
    private InternalResourceViewResolver resourceViewResolver()
    {
        InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
        //请求视图文件的前缀地址
        internalResourceViewResolver.setPrefix("/WEB-INF/jsp/");
        //请求视图文件的后缀
        internalResourceViewResolver.setSuffix(".jsp");
        return internalResourceViewResolver;
    }
}

到了这里,关于Spring MVC 拦截器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring MVC学习之——拦截器

    Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、判断用户是否登录等。 ​ 拦截器依赖于web框架,在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。 Spring的拦

    2024年01月20日
    浏览(47)
  • Spring MVC拦截器和跨域请求

    SpringMVC的拦截器(Interceptor)也是AOP思想的一种实现方式。它与Servlet的过滤器(Filter)功能类似,主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。 拦截器和过滤器的区别 拦截器是SpringMVC组件,而过滤器是

    2024年02月16日
    浏览(56)
  • Spring MVC拦截器Interceptor使用(判断用户登录)

    Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。 拦截器可以在进入处理器之前做一些操作,或者在处理器完成后进行操作,甚至是

    2024年02月09日
    浏览(46)
  • Spring MVC学习笔记,包含mvc架构使用,过滤器、拦截器、执行流程等等

    😀😀😀创作不易,各位看官点赞收藏. Spring MVC:Spring MVC是Spring Framework的一部分,是基于java实现的MVC的轻量级Web框架。 官网文档地址:https://docs.spring.io/spring-framework/docs/4.2.4.RELEASE/spring-framework-reference/html/mvc.html 轻量级,简单易学。 高效,基于请求和响应的MVC框架。 与Spri

    2024年02月15日
    浏览(48)
  • Spring-MVC使用JSR303及拦截器,增强网络隐私安全

    目录 一、JSR303 ( 1 )  是什么 ( 2 )  作用 ( 3 )  常用注解 ( 4 )  入门使用 二、拦截器 2.1  是什么 2.2  拦截器与过滤器的区别 2.3  应用场景 2.4 基础使用 2.5 用户登录权限控制 给我们带来的收获 JSR 303是Java规范请求(Java Specification Request)的一部分, 它定义了一套标准的Jav

    2024年02月09日
    浏览(43)
  • 掌握Spring MVC拦截器整合技巧,实现灵活的请求处理与权限控制!

    (1)浏览器发送一个请求会先到Tomcat的web服务器。 (2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源。 (3)如果是静态资源,会直接到Tomcat的项目部署目录下去直接访问。 (4)如果是动态资源,就需要交给项目的后台代码进行处理。 (5)在找到具体的方法之前

    2024年01月22日
    浏览(49)
  • Spring MVC学习随笔-Ajax集成(JSON格式返回数据)、拦截器(MyInterceptor)、全局异常处理(GlobalExceptionResolver)

    学习视频:【编程不良人】继spring之后快速入门springmvc,面对SpringMVC不用慌 引入相关依赖 开发控制器 日期格式修正 可以正常响应 拦截器 :Interceptor 拦截 中断 类似于javaweb中的Filter,不过没有Filter那么强大 作用 Spring MVC的拦截器是一种用于在请求处理过程中进行预处理和后处

    2024年02月05日
    浏览(51)
  • 【Spring底层原理高级进阶】轻松掌握 Spring MVC 的拦截器机制:深入理解 HandlerInterceptor 接口和其实现类的用法

     🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏 《Spring 狂野之旅:底层原理高级进阶》 🚀 本专栏纯属为爱发电永久免费!!! 这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://suze

    2024年02月20日
    浏览(54)
  • 【SpringMVC】| SpringMVC拦截器

    目录 一:SpringMVC拦截器 1. 拦截器介绍 2. HandlerInterceptor接口分析 3. 自定义拦截器实现权限验证 SpringMVC 中的 Interceptor 拦截器,它的主要作用是拦截指定的用户请求,并进行相应的预处理与后处理。其拦截的时间点在“处理器映射器根据用户提交的请求映射出了所要执行的处理

    2024年02月06日
    浏览(45)
  • springMVC之拦截器

    拦截器 SpringMVC中的拦截器用于拦截控制器方法的执行 SpringMVC中的拦截器需要实现HandlerInterceptor SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置: FirstIntercepor类: SecondInterceptor类: SpringMVC中的拦截器有三个抽象方法: preHandle:控制器方法执行之前执行preHandle(),其bool

    2024年02月10日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包