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配置文件形式进行针对框架个性化定制,可以自定义一些HandlerInterceptorViewResolverMessageConverter

  基于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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux 查看Redis 的版本

    Linux 查看Redis 的版本1.redis-server–version和redis-server-v查询结果2.redis-cli–version和redis-cli-v查询结果注:因为redis的server与cli同时安装,所以二者查出的结果基本一致。…

    2022年5月27日
    45
  • 手机号码归属地服务[转载]「建议收藏」

    手机号码归属地服务[转载]「建议收藏」服务地址:http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmxWebXml.com.cn国内手机号码归属地查询WEB服务,提供最新的国内手机号码段归属地数据,每月更新。使用本站WEB服务请注明或链接本站:http://www.webxml.com.cn/感谢大家的支持!支持下列操作。有关正式定义,请查看服务说明。…

    2022年7月22日
    11
  • HTML 5 <canvas> 标签

    HTML 5 <canvas> 标签

    2021年10月10日
    38
  • 如何使用PLATFORM SDK

    如何使用PLATFORM SDK安装好SDK后,打开VC 在菜单中选择TOOL->OPTIONS->DIRECTORIES 在INCLUDEFILES中把SDK的INCLUDE目录添加到里面,把它放在第一项,就可以用SDK了。 

    2022年6月3日
    32
  • 使用nginx实现动静分离「建议收藏」

    使用nginx实现动静分离「建议收藏」一、什么是动静分离动静分离是指在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。nginx的动静分离,指的是由nginx将客户端请求进行分类转发,静态资源请求(如html、css、图片等)由静态资源服务器处理,动态资源请求(如jsp页面、servlet程序等)由tomcat服务器处理,tomcat本身是用来处理动态资源的,同时tomcat也能处理静态资源,但是tomcat本身处理静态资源的

    2022年5月1日
    37
  • ssh 命令连接

    ssh 命令连接Linuxssh命令详解SSH(远程连接工具)连接原理:ssh服务是一个守护进程(demon),系统后台监听客户端的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求(IP22端口),包括公共秘钥等交换等信息。ssh服务端由2部分组成:openssh(提供ssh服务)openssl(提供加密的程序)ssh的客户端可以用XSHELL,Securecrt,Moba…

    2022年6月24日
    29

发表回复

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

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