Java Web学习(十)Java拦截器
文章更新时间:2020/04/07
一、引言
既然要用拦截器,首先先得简单了解一下什么是拦截器:
概念:java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。
作用域:动态拦截Action调用的对象(也就是我们的controller层)
我们日常开发中,经常会遇到这个场景:在访问系统功能前,需要用户登录,不登陆的话无法使用我们的系统,那么如果在每个方法前都加上登录代码...【emmm....我想应该不会有人这么干吧...】,常见的可以使用以下几种方式:
- 使用AOP切面功能来实现
- 使用Spring的拦截器相关接口来自定义拦截器
- 实现WebMvcConfigurer接口,重写addCorsMappings()方法和addInterceptors()方法【配置拦截器】
- 实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter,重写preHandle()方法【自定义拦截器】
下面我们就一起来看下一下怎么实现吧~
二、代码实现
AOP切面方式
切面方式配置的话,得配置到包路径下或者每个具体方法都要配置,个人不是很喜欢用切面的方式来配置拦截器,用来记录日志或者其他功能可以使用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类就具体在这里配置)
这里我们主要应用的是前两个方法,添加拦截器和跨域配置,下面来看下具体实现:
拦截器配置源码:
/**
* 拦截器的属性配置
*
* @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()方法,方法内容为拦截到请求后的处理
参考文章:
- SpringBoot---WebMvcConfigurer详解
- JAVA中Cookie MaxAge属性及其使用
- Springboot 拦截器配置(登录拦截)
- 跨域与拦截器同时配置导致跨域失败
- springBoot(6)---过滤器,监听器,拦截器
Java Web学习(十)Java拦截器的更多相关文章
- Java Web 中 过滤器与拦截器的区别
过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法u ...
- 【java web】过滤器、拦截器、监听器的区别
一.对比: 1.1 过滤器和拦截器的区别: ①拦截器是基于java的反射机制的,而过滤器是基于函数回调. ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器. ③拦截器只能对actio ...
- java web 学习十二(session)
一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...
- java web 学习十(HttpServletRequest对象1)
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
- java web 学习十五(jsp基础语法)
任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. 一.JSP模版元素 JSP页面中的HTML内容称之 ...
- springMVC学习 十二 拦截器
一 拦截器概述 拦截器技术比较像java web技术中的过滤器技术,都是发送 请求时被拦截器拦截,在控制器的前后添加额外功能.但是和Spring中的Aop技术是由区别的.AOP 在特定方法前后扩充(一 ...
- spring boot 学习(十二)拦截器实现IP黑名单
拦截器实现IP黑名单 前言 最近一直在搞 Hexo+GithubPage 搭建个人博客,所以没怎么进行 SpringBoot 的学习.所以今天就将上次的”?秒防刷新”进行了一番修改.上次是采用注解加拦 ...
- java web 学习十六(JSP指令)
一.JSP指令简介 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: pa ...
- java web 学习十四(JSP原理)
一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...
- java web 学习笔记 - Java Bean
1. Java Bean 是一个简单的 java 类,一般放在WEB-INF下的 classes目录下(如果没有则需要手工新建) 一个简单的Bean包括属性,getter ,setter方法,如果没有 ...
随机推荐
- 计算机网络-链路层(2)多路访问控制协议(multiple access control protocol)
单一共享广播信道,如果两个或者两个以上结点同时传输,会互相干扰(interference) 冲突(collision):结点同时接收到两个或者多个信号→接收失败! MAC协议采用分布式算法决定结点如何 ...
- Webstorm的常用快捷键
编辑 Ctrl + Space 基本代码完成 (任何类. 方法或变量名称) Ctrl + Shift + Enter 完整的语句 Ctrl + P (在方法调用参数) 内的参数信息 Ctrl + Q ...
- lammps计算的应力的方法
摘自:http://dxli75.blog.163.com/blog/static/106768289201142893419587/ lammps计算的应力有两种: 一是体系整体的应力状态,通过在t ...
- GitHub 热点速览 Vol.35:Let's Go,Rust 大放异彩
摘要:语言之争,一直存在于各类社群,不论是单个编程语言的交流群,亦或是 NoSQL.云开发等技术群,总能看到"要不要换 Go"."Rust 比 C++ 更强"的 ...
- Unity Prefab关联
Unity3D研究院之Prefab里面的Prefab关联问题http://www.xuanyusong.com/archives/3042
- Unity3d启动事件 - InitializeOnLoad
监听Unity3d启动事件 - InitializeOnLoad http://blog.csdn.net/huutu/article/details/42318499 Unity 监听第一次进入播放 ...
- Typed Lua
https://the-ravi-programming-language.readthedocs.io/en/latest/ravi-overview.html https://github.com ...
- unity shader
Unity新的shader叫做 基于物理渲染的shader,先介绍下新的shader具有的特性: Energy Conservation(能量守恒):这是一个基于物理的概念,它确保物体反射的光线不会比 ...
- C++STL complex吃书使用指南
说在前面: complex即为复数 使用c++自带的complex类型,首先要有<complex>头文件,还要使用std命名空间 声明方式: complex <T> a: 声 ...
- [WUST-CTF]Web WriteUp
周末放假忙里偷闲打了两场比赛,其中一场就是武汉科技大学的WUST-CTF新生赛,虽说是新生赛,题目质量还是相当不错的.最后有幸拿了总排第5,记录一下Web的题解. checkin 进入题目询问题目作者 ...