SpringMVC08——拦截器——2021-05-11
拦截器概述
SpringMVC的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并做相应的处理。
例如:进行权限验证、记录请求信息的日志、判断用户是否登录等。
拦截器的定义
要使用SpringMVC的拦截器,就需要对拦截器类进行定义和配置。通常拦截器类可以通过两种方式来定义。
- 通过实现HandlerInterceptor接口
- 继承HandlerInterceptor接口的实现类HAndlerInterceptorAdapter
- 实现WebRequestInterceptor接口
- 继承WebRequestInterceptor接口的实现类
这里我们用HandlerInterceptor接口的定义方式为例:
- 自定义拦截器类
/**
* 这里不会强制要求重写方法
*/
public class MyInterceptor implements HandlerInterceptor {
//在请求处理的方法之前执行
//如果返回true执行下一个拦截器
//如果返回false就不执行下一个拦截器
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("------------处理前------------");
return true;
}
//在请求处理方法执行之后执行
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("------------处理后------------");
}
//在dispatcherServlet处理后执行,做清理工作.
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("------------清理------------");
}
}
- 拦截器的配置
要是自定义的拦截器类生效,还需要再SpringMVC的配置文件中进行配置
<!--关于拦截器的配置-->
<mvc:interceptors>
<mvc:interceptor>
<!--/** 包括路径及其子路径-->
<!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截-->
<!--/admin/** 拦截的是/admin/下的所有-->
<mvc:mapping path="/**"/>
<!--bean配置的就是拦截器-->
<bean class="com.pp.config.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
- 编辑一个拦截器的控制器——InterceptorController
//测试拦截器的控制器
@Controller
public class InterceptorController {
@RequestMapping("/interceptor")
@ResponseBody
public String test(){
System.out.println("控制器中的方法执行了~~~");
return "hello";
}
}
- 配置tomcat测试
在浏览器地址栏输入http://localhost:8080/interceptor
这时候回发现拦截器放行时,前端显示hello!
注意:配置多个拦截器,直接在配置文件中增加mvc:interceptor即可!
案例:实现用户登录权限验证!
需求:
只有登录后的用户才能访问系统的主页面,如果没有登陆系统而直接访问主页面,则拦截器会将请求拦截,并转发到登陆页面要求重新登录!相同的如果用户名或密码错误,也会要求重新登录。
- 创建一个User类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User {
private Integer id;
private String username;
private String password;
}
- 创建控制器类LoginController,在该类中定义向主页跳转,向登陆页面跳转,执行用户登录等操作。
@Controller
public class LoginController {
/**
* 向用户登录页面跳转
* @return
*/
@RequestMapping(value = "/login",method = RequestMethod.GET)
public String toLogin(){
return "login";
}
/**
* 用户登录
* @return
*/
@RequestMapping(value = "/login",method = RequestMethod.POST)
public String login(User user, Model model, HttpSession httpSession){
//获取用户名和密码
String username = user.getUsername();
String password = user.getPassword();
//模拟从数据库获取数据,进行判断
if (username != null && username.equals("panpan") &&
password != null && password.equals("123456")){
//将用户对象添加到Session
httpSession.setAttribute("USER_SESSION",user);
//重定向到主页面的跳转方法
//toMain();
return "redirect:main";
}
model.addAttribute("msg","用户名或密码错误,请重新登录");
return "login";
}
/**
* 向用户主页面跳转
*/
@RequestMapping("/main")
public String toMain(){
return "main";
}
/**
* 退出登录
*/
public String logout(HttpSession httpSession){
//清楚Session
httpSession.invalidate();
//重定向到登录页面的跳转方法
return "redirect:login";
}
}
注意:向用户登录页面跳转和用户登录方法的@RequestMapping注解的value属性值相同,但是method属性值不同,这是因为跳转到登录页面接受的是GET方法提交的方法,而用户登录接受的是POST方式提交的方法。
- 创建LoginInterceptor
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取请求的URL
String url = request.getRequestURI();
//URL:除了login.jsp是可以公开的,其他的url都进行拦截控制
if(url.indexOf("/login") >= 0){
return true;
}
//获取Session
HttpSession session = request.getSession();
User user = (User) session.getAttribute("USER_SESSION");
//判断Session中是否有用户数据,如果有,则返回true,继续向下执行
if(user != null){
return true;
}
//不符合条件的给出提示信息,并转发到登录页
request.setAttribute("msg","您还没有登录,请先登录!");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp")
.forward(request,response);
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
- 在Spring-mvc.xml中添加拦截器
<!--关于拦截器的配置-->
<mvc:interceptors>
<mvc:interceptor>
<!--/** 包括路径及其子路径-->
<!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截-->
<!--/admin/** 拦截的是/admin/下的所有-->
<mvc:mapping path="/**"/>
<!--bean配置的就是拦截器-->
<bean class="com.pp.config.LoginInterceptor"/>
</mvc:interceptor>
<!--多个拦截器配置-->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.pp.config.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
- 在jsp文件夹中创建main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页</title>
</head>
<body>
当前用户:${USER_SESSION.username}
<a href="${pageContext.request.contextPath}/logout">退出</a>
</body>
</html>
- 创建一个login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>登陆页面</h1>
<span style="color: red">${msg}</span>
<form action="${pageContext.request.contextPath}/login" method="post" >
用户名:<input type="text" name="username">
密 码:<input type="text" name="password">
<input type="submit" value="登录">
</form>
</body>
</html>
- 最后!配置tomcat测试
- 当直接访问http://localhost:8080/main时,会发现要求重新登录

- 输入正确的用户名和密码即可正确跳转main页面,这里实现了退出登录,点击退出重新登陆!


SpringMVC08——拦截器——2021-05-11的更多相关文章
- springboot开发浅谈 2021/05/11
学习了这么久,本人希望有时间能分享一下,这才写下这篇浅谈,谈谈软件,散散心情. 这是本人的博客园账号,欢迎关注,一起学习. 一开始学习springboot,看了好多网站,搜了好多课程.零零落落学了一些 ...
- 05 SpringMVC:02.参数绑定及自定义类型转换&&04.SpringMVC返回值类型及响应数据类型&&05.文件上传&&06.异常处理及拦截器
springMVC共三天 第一天: 01.SpringMVC概述及入门案例 02.参数绑定及自定义类型转换 03.SpringMVC常用注解 第二天: 04.SpringMVC返回值类型及响应数据类型 ...
- 初学者易上手的SSH-struts2 05拦截器与自定义拦截器
因为自己对于struts2也不是很了解,这章将是struts2的最后一章了.那么这一章主要介绍的是拦截器以及怎么样来自定义一个拦截器. struts2的拦截器位于struts2-core(核心包)-& ...
- SpringBoot(11) SpringBoot自定义拦截器
自定义拦截器共两步:第一:注册.第二:定义拦截器. 一.注册 @Configuration 继承WebMvcConfigurationAdapter(SpringBoot2.X之前旧版本) 旧版本代码 ...
- SpringMVC框架05——拦截器
1.拦截器概述 Spring MVC的拦截器(Interceptor)与Java Servlet的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证.记录请求信息的 ...
- 11. SpringMVC拦截器(资源和权限管理)
1.DispatcherServlet SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet. DispatcherServl ...
- JAVAEE——SSH项目实战05:用户注册、登陆校验拦截器、员工拜访客户功能和MD5加密
作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7170519.html 一.用户注册 显示错误信息到页面上的另一种方法: public ...
- 2018.11.29 Struts2中拦截器的学习&项目的实际运用
struts2官方架构 拦截器的创建 第一种方式 第二种方式 看源码AbstractInterceptor 底层已经帮我们写过这些方法了 第三种方式(推荐) 拦截器API学习 放行 前后处理 不放行, ...
- Struts2框架05 result标签的类型、拦截器
1 result标签是干什么的 就是结果,服务器处理完返回给浏览器的结果:是一个输出结果数据的组件 2 什么时候需要指定result标签的类型 把要输出的结果数据按照我们指定的数据类型进行处理 3 常 ...
- 【SpringMVC学习11】SpringMVC中的拦截器
Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用 ...
随机推荐
- Java反射,看完就会用
什么是反射 在说反射概念之前,我们先说另外2个概念:编译期和运行期. 编译期: 编译期是源代码从文本形式转换为字节码的过程,这发生在Java代码被JVM执行之前. 在编译期,编译器对源代码进行语法检查 ...
- C++面试复习总结
C++面试 本人20年3到4月内面了近十家公司,整理一下C++客户端问的多的基础问题 另:操作系统面试总结,OpenGL面试总结,计算机网络面试总结 代码到可执行程序 预处理:条件编译,头文件包含,宏 ...
- 【DevCloud · 敏捷智库】暴走在发布前夜的开发,你怕不怕?
摘要:每个月都有2天开发团队要通宵熬夜,大家苦不堪言.有个别的开发同学,骂完公司骂同事,骂完同事骂客户的,甚至连自己都不放过-- 来自一个CEO的叙述 在一次企业交流会上,一个公司的CEO提道,&qu ...
- 物联网通信技术最全科普!你一定要了解的NB-IoT
摘要: NB-IoT(窄带蜂窝物联网)产业正在迅速崛起. 我们这一期的文章主要是普及一些NB-IoT通信技术的相关知识点.也希望你能get到属于自己的知识盲点! 一.前言 NB-IoT(窄带蜂窝物联网 ...
- 一文带你了解华为云GaussDB的五大黑科技
摘要:在华为开发者大会2021(HDC·Cloud)中,华为云数据库多位技术专家分享了GaussDB系列数据库全新5大黑科技. 4月24-26日,华为开发者大会2021(HDC·Cloud)在深圳隆重 ...
- 工商银行:应用多k8s集群管理及容灾实践
摘要:在华为开发者大会(Cloud)2021上,工商银行Paas云*台架构师沈一帆发表了<工商银行多k8s集群管理及容灾实践>主题演讲,分享了工商银行使用多云容器编排引擎Karmada的落 ...
- 浅谈sql执行流程、innodb架构设计、buffer pool缓冲池
一.从服务端到数据库sql执行流程: 1.SQL接口:负责处理接收到sql的语句 2.查询解析器:负责将sql变成数据库可以看懂的语言 3.查询优化器:选择最优的查询路径(针对你编写的复杂sql语句生 ...
- 数据工程师必备的8项技能,不要只知道Python!
欢迎关注公众号:机器学习算法与Python实战(ID:tjxj666) 原作:Mohammed M Jubapu 译者:机器学习算法与Python实战(公众号ID:tjxj666) 英文:https: ...
- 对于 CDN 的多元理解
这是二狗子为数不多的创业故事. 那时二狗子还是一名高中生,学校是封闭式管理.由于二狗子总忍不住上课吃零食,他便每周一都会背着一麻袋零食来上学. 这上课吃零食行为,不知不觉诱惑到了周围的同学.大家纷纷向 ...
- 2024-01-17:lc的30. 串联所有单词的子串
2024-01-17:用go语言,给定一个字符串 s 和一个字符串数组 words. words 中所有字符串 长度相同. s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接 ...