Java 拦截器

Java 拦截器一、引言  既然要用拦截器,首先先得简单了解一下什么是拦截器:  概念:java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。  作用域:动态拦截Action调用的对象(也就是我们的controller层)  我们日常开发中,经常会遇到这个场景:在访问系统功能前,需要用户登录,不登陆的话无法使用我们的系统,那么如果在每个方法

大家好,又见面了,我是你们的朋友全栈君。

一、引言

  既然要用拦截器,首先先得简单了解一下什么是拦截器:

  概念:java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。

  作用域:动态拦截Action调用的对象(也就是我们的controller层)

  我们日常开发中,经常会遇到这个场景:在访问系统功能前,需要用户登录,不登陆的话无法使用我们的系统,那么如果在每个方法前都加上登录代码…【emmm….我想应该不会有人这么干吧…】,常见的可以使用以下几种方式:

  • 使用AOP切面功能来实现
  • 使用Spring的拦截器相关接口来自定义拦截器
    • 实现WebMvcConfigurer接口,重写addCorsMappings()方法和addInterceptors()方法【配置拦截器】
    • 实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter,重写preHandle()方法【自定义拦截器】

  下面我们就一起来看下一下怎么实现吧~

二、代码实现

AOP切面方式

Java 拦截器

   切面方式配置的话,得配置到包路径下或者每个具体方法都要配置,个人不是很喜欢用切面的方式来配置拦截器,用来记录日志或者其他功能可以使用aop,这篇文章就不详细讲解了,只简单说明一下以切面方式实现时的大致模型,我们着重看下以另一种方式来实现拦截器的功能。

实现WebMvcConfigurer接口的方式

  WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,可以自定义一些Handler,Interceptor,ViewResolver,MessageConverter。

  基于java-based方式的spring mvc配置,需要创建一个配置类并实现WebMvcConfigurer 接口。在Spring Boot 1.5版本都是靠重写WebMvcConfigurerAdapter的方法来添加自定义拦截器,消息转换器等。SpringBoot 2.0 后,该类被标记为@Deprecated(弃用)。官方推荐直接实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport。

  简单介绍一下WebMvcConfigurer中比较重要的几个方法:

  • addInterceptors:添加拦截器
  • addCorsMappings:跨域
  • addViewControllers:页面跳转(不用像现在我们要写一个Controller进行映射就可实现跳转)
  • addResourceHandlers:静态资源(自定义静态资源映射目录)
  • configureDefaultServletHandling:默认静态资源处理器
  • configureViewResolvers:视图解析器(配置请求视图映射,配置了以后我们返回一个页面路径的字符串时,解析器会帮我们拼装前缀和后缀等信息)
  • configureMessageConverters:信息转换器(比如我们入参的信息直接转换成json或者转换成对应的bean类就具体在这里配置)

  这里我们主要应用的是前两个方法,添加拦截器和跨域配置,下面来看下具体实现:

Java 拦截器

Java 拦截器

Java 拦截器

 拦截器配置源码:


/**
 * 拦截器的属性配置
 *
 * @Author 有梦想的肥宅
 */
@Configuration//标识这是一个配置类
public class InterceptorConfiguration implements WebMvcConfigurer {

    /**
     * 重写addCorsMappings()解决跨域问题
     * 配置:允许http请求进行跨域访问
     *
     * @param registry
     * @Author 有梦想的肥宅
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")//指哪些接口URL需要增加跨域设置
                .allowedOrigins("*")//指的是前端哪些域名被允许跨域
                .allowCredentials(true)//需要带cookie等凭证时,设置为true,就会把cookie的相关信息带上
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")//指的是允许哪些方法
                .maxAge(3600);//cookie的失效时间,单位为秒(s),若设置为-1,则关闭浏览器就失效
    }

    /**
     * 重写addInterceptors()实现拦截器
     * 配置:要拦截的路径以及不拦截的路径
     *
     * @param registry
     * @Author 有梦想的肥宅
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册Interceptor拦截器(Interceptor这个类是我们自己写的拦截器类)
        InterceptorRegistration registration = registry.addInterceptor(new Interceptor());
        //addPathPatterns()方法添加需要拦截的路径
        registration.addPathPatterns("/**");                      //所有路径都被拦截
        //excludePathPatterns()方法添加不拦截的路径
        registration.excludePathPatterns(                         //添加不拦截路径
                "/demo/loginPage",            //登录页面的地址【不拦截】
                "/**/*.html",            //html静态资源
                "/**/*.js",              //js静态资源
                "/**/*.css"              //css静态资源
        );
    }
}

自定义拦截器源码:

/**
 * 拦截器
 * @Author 有梦想的肥宅
 */
public class Interceptor implements HandlerInterceptor {
    /**
     * 在请求处理之前进行调用(Controller方法调用之前)
     * @Author 有梦想的肥宅
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("执行了Interceptor的preHandle方法");
        try {
            //统一拦截(查询当前session是否存在UserInfoVO用户信息)(这里UserInfoVO会在每次登陆成功后,写入session)
            UserInfoVO user = (UserInfoVO) request.getSession().getAttribute("UserInfoVO");
            if (user != null) {
                return true;
            }
            //这里设置拦截以后重定向的页面,一般设置为登陆页面地址
            response.sendRedirect(request.getContextPath() + "/demo/loginPage");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return true;//如果设置为false时,被请求时,拦截器执行到此处将不会继续操作
        //如果设置为true时,请求将会继续执行后面的操作
    }
}

小结:从上面的代码可以看出,要实现拦截器一般需要以下几个步骤:

  • 1、写一个实现了WebMvcConfigurer接口的配置类
  • 2、重写其中的addCorsMappings()方法【配置跨域信息】和addInterceptors()方法【配置拦截器信息,如拦截路径和开放路径等】
  • 3、写一个实现HandlerInterceptor接口的自定义拦截器
  • 4、重写其中的preHandle()方法,方法内容为拦截到请求后的处理
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/133347.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 程序员法则xiazai_程序员手册

    程序员法则xiazai_程序员手册CSDN上很火的一帖子,全中国所有程序员都在集体YY(花了好半天时间才知道YY==意淫),http://community.csdn.net/Expert/topic/3881/3881210.xml?temp=.9396173CSDN上的帖子,可以看看人气http://www.javadict.com/profz.htm小说版,没有烦人的跟贴 …

    2022年10月6日
  • 什么叫侧面指纹识别_前面侧面还是背面?手机指纹识别放哪儿合适

    什么叫侧面指纹识别_前面侧面还是背面?手机指纹识别放哪儿合适自指纹识别功能在智能手机上逐渐被普及之后,被安卓厂商们所抛弃的实体按键又一次回到了手机上。不过与之前不同,这次实体按键并不一定要承载Home键的功能,因此指纹识别的位置也被各个手机厂商玩出了花样,传统一点的将其放在手机的正面,大胆一点的则将指纹识别按键放在机身背面,也有个别厂商为避免前后面板开孔,将指纹识别放在了机身的侧边。那么指纹识别究竟放在哪里更合适呢?目前,在苹果的“号召”下,大部分手机厂商…

    2022年6月16日
  • 软件著作权的源代码_手机桌面整理软件

    软件著作权的源代码_手机桌面整理软件《(最新整理)软件著作权-源代码范本》由会员分享,可在线阅读,更多相关《(最新整理)软件著作权-源代码范本(127页珍藏版)》请在人人文库网上搜索。1、完整)软件著作权-源代码范本(完整)软件著作权-源代码范本编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)软件著作…

    2022年9月2日
  • python画太极八卦图_先天太极八卦图的唯一正确画法

    python画太极八卦图_先天太极八卦图的唯一正确画法我们先百度一下先天太极八卦图.↑,看看结果百度出来的图片第一页上半部分,结果非常惊人,40张图片,没有一张是正确的。错误原因分为两大类:1.太极图旋转方向或阴阳鱼所在位置错误2.八卦中每卦的三爻画法错误1.先天太极八卦图的太极是顺时针旋转;阴阳鱼位置是:阳鱼在上,阴鱼在下,阴阳鱼眼在同一条水平线上(PS:太极图有人喜欢用古画法,有人习惯用流通最广的画法,两种我都列出,但我习惯用流通最广最常见的…

    2022年5月25日
  • Java基础问题整理「建议收藏」

    备注:针对基本问题做一些基本的总结,不是详细解答!1.HashMap和ConcurrentHashMap区别(必考)2.ConcurrentHashMap的数据结构(必考)3.高并发HashMap的环是如何产生的4.HashMap1.7与HashMap1.8的区别,从数据结构上、Hash值的计算上、链表数据的插入方法、内部Entry类的实现上分析?5.Hash1.7是基于数组…

    2022年4月6日
  • idea 2021.10.3 激活码【2021最新】

    (idea 2021.10.3 激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1STL5S9V8F-eyJsaWNlbnNlSWQiOi…

    2022年3月27日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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