java拦截器_Java Web学习(九)Java拦截器

文章更新时间:2020/04/07

一、引言

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

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

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

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

使用AOP切面功能来实现

使用Spring的拦截器相关接口来自定义拦截器

实现WebMvcConfigurer接口,重写addCorsMappings()方法和addInterceptors()方法【配置拦截器】

实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter,重写preHandle()方法【自定义拦截器】

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

二、代码实现

AOP切面方式

2a82d819a2b32579e75d275bb468cd6c.png

切面方式配置的话,得配置到包路径下或者每个具体方法都要配置,个人不是很喜欢用切面的方式来配置拦截器,用来记录日志或者其他功能可以使用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类就具体在这里配置)

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

b9edf097da4f60693c812b512e64f5bb.png

02ec9c35624636fc9c764adeb5e36e0e.png

e1ed78b5a895d7ad0d74586412c71ed4.png

拦截器配置源码:

/*** 拦截器的属性配置

*

* @Author 有梦想的肥宅*/@Configuration//标识这是一个配置类

public class InterceptorConfiguration implementsWebMvcConfigurer {/*** 重写addCorsMappings()解决跨域问题

* 配置:允许http请求进行跨域访问

*

*@paramregistry

* @Author 有梦想的肥宅*/@Overridepublic voidaddCorsMappings(CorsRegistry registry) {

registry.addMapping("/**")//指哪些接口URL需要增加跨域设置

.allowedOrigins("*")//指的是前端哪些域名被允许跨域

.allowCredentials(true)//需要带cookie等凭证时,设置为true,就会把cookie的相关信息带上

.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")//指的是允许哪些方法

.maxAge(3600);//cookie的失效时间,单位为秒(s),若设置为-1,则关闭浏览器就失效

}/*** 重写addInterceptors()实现拦截器

* 配置:要拦截的路径以及不拦截的路径

*

*@paramregistry

* @Author 有梦想的肥宅*/@Overridepublic voidaddInterceptors(InterceptorRegistry registry) {//注册Interceptor拦截器(Interceptor这个类是我们自己写的拦截器类)

InterceptorRegistration registration = registry.addInterceptor(newInterceptor());//addPathPatterns()方法添加需要拦截的路径

registration.addPathPatterns("/**"); //所有路径都被拦截//excludePathPatterns()方法添加不拦截的路径

registration.excludePathPatterns( //添加不拦截路径

"/demo/loginPage", //登录页面的地址【不拦截】

"/**/*.html", //html静态资源

"/**/*.js", //js静态资源

"/**/*.css" //css静态资源

);

}

}

自定义拦截器源码:

/*** 拦截器

* @Author 有梦想的肥宅*/

public class Interceptor implementsHandlerInterceptor {/*** 在请求处理之前进行调用(Controller方法调用之前)

* @Author 有梦想的肥宅*/@Overridepublic booleanpreHandle(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()方法,方法内容为拦截到请求后的处理

参考文章:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值