拦截器概述

SpringMVC的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并做相应的处理。
例如:进行权限验证、记录请求信息的日志、判断用户是否登录等。

拦截器的定义

要使用SpringMVC的拦截器,就需要对拦截器类进行定义和配置。通常拦截器类可以通过两种方式来定义。
  1. 通过实现HandlerInterceptor接口
  2. 继承HandlerInterceptor接口的实现类HAndlerInterceptorAdapter
  3. 实现WebRequestInterceptor接口
  4. 继承WebRequestInterceptor接口的实现类

这里我们用HandlerInterceptor接口的定义方式为例:

  1. 自定义拦截器类
/**
* 这里不会强制要求重写方法
*/
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("------------清理------------");
}
}
  1. 拦截器的配置
    要是自定义的拦截器类生效,还需要再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>
  1. 编辑一个拦截器的控制器——InterceptorController
//测试拦截器的控制器
@Controller
public class InterceptorController {
@RequestMapping("/interceptor")
@ResponseBody
public String test(){
System.out.println("控制器中的方法执行了~~~");
return "hello";
}
}
  1. 配置tomcat测试
    在浏览器地址栏输入http://localhost:8080/interceptor
    这时候回发现拦截器放行时,前端显示hello!
    注意:配置多个拦截器,直接在配置文件中增加mvc:interceptor即可!

案例:实现用户登录权限验证!

需求:
只有登录后的用户才能访问系统的主页面,如果没有登陆系统而直接访问主页面,则拦截器会将请求拦截,并转发到登陆页面要求重新登录!相同的如果用户名或密码错误,也会要求重新登录。

  1. 创建一个User类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User {
private Integer id;
private String username;
private String password;
}
  1. 创建控制器类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方式提交的方法。

  1. 创建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);
}
}
  1. 在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>
  1. 在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>
  1. 创建一个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">
密&nbsp;&nbsp;&nbsp;码:<input type="text" name="password">
<input type="submit" value="登录">
</form>
</body>
</html>
  1. 最后!配置tomcat测试
  • 当直接访问http://localhost:8080/main时,会发现要求重新登录
  • 输入正确的用户名和密码即可正确跳转main页面,这里实现了退出登录,点击退出重新登陆!

SpringMVC08——拦截器——2021-05-11的更多相关文章

  1. springboot开发浅谈 2021/05/11

    学习了这么久,本人希望有时间能分享一下,这才写下这篇浅谈,谈谈软件,散散心情. 这是本人的博客园账号,欢迎关注,一起学习. 一开始学习springboot,看了好多网站,搜了好多课程.零零落落学了一些 ...

  2. 05 SpringMVC:02.参数绑定及自定义类型转换&&04.SpringMVC返回值类型及响应数据类型&&05.文件上传&&06.异常处理及拦截器

    springMVC共三天 第一天: 01.SpringMVC概述及入门案例 02.参数绑定及自定义类型转换 03.SpringMVC常用注解 第二天: 04.SpringMVC返回值类型及响应数据类型 ...

  3. 初学者易上手的SSH-struts2 05拦截器与自定义拦截器

    因为自己对于struts2也不是很了解,这章将是struts2的最后一章了.那么这一章主要介绍的是拦截器以及怎么样来自定义一个拦截器. struts2的拦截器位于struts2-core(核心包)-& ...

  4. SpringBoot(11) SpringBoot自定义拦截器

    自定义拦截器共两步:第一:注册.第二:定义拦截器. 一.注册 @Configuration 继承WebMvcConfigurationAdapter(SpringBoot2.X之前旧版本) 旧版本代码 ...

  5. SpringMVC框架05——拦截器

    1.拦截器概述 Spring MVC的拦截器(Interceptor)与Java Servlet的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证.记录请求信息的 ...

  6. 11. SpringMVC拦截器(资源和权限管理)

    1.DispatcherServlet SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet.     DispatcherServl ...

  7. JAVAEE——SSH项目实战05:用户注册、登陆校验拦截器、员工拜访客户功能和MD5加密

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7170519.html 一.用户注册   显示错误信息到页面上的另一种方法: public ...

  8. 2018.11.29 Struts2中拦截器的学习&项目的实际运用

    struts2官方架构 拦截器的创建 第一种方式 第二种方式 看源码AbstractInterceptor 底层已经帮我们写过这些方法了 第三种方式(推荐) 拦截器API学习 放行 前后处理 不放行, ...

  9. Struts2框架05 result标签的类型、拦截器

    1 result标签是干什么的 就是结果,服务器处理完返回给浏览器的结果:是一个输出结果数据的组件 2 什么时候需要指定result标签的类型 把要输出的结果数据按照我们指定的数据类型进行处理 3 常 ...

  10. 【SpringMVC学习11】SpringMVC中的拦截器

    Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用 ...

随机推荐

  1. windows10更新文件存在哪里

    windows10更新文件存在哪里windows10更新文件存在哪里 电脑系统每次更新都会有相应的更新文件,很多win10用户都想知道电脑更新文件存在哪里,其实这个很好找的. 你先双击此电脑进入,然后 ...

  2. ElasticSearch之cat transforms API

    命令样例如下: curl -X GET "https://localhost:9200/_cat/transforms?v=true&format=json" --cace ...

  3. DNS解析中CNAME和MX记录冲突

    转载:DNS中CNAME和MX记录的冲突 在DNS解析中,CNAME记录与其他记录往往是互斥的.最常见的是CNAME记录和MX记录的互斥.例如我们在http://example.com部署官网,通过C ...

  4. k8s环境设置-pod下载及重启策略

    k8s环境设置 在我们开始使用k8s之前,我们可以先做一些环境配置,使k8s更加的方便使用 第一个要做的就是kubectl命令的补全 在使用kubectl的时候你会发现参数你是Tab不出来的,这时候我 ...

  5. vue-admin-template动态菜单后台获取菜单

    vue-admin-template.vue-element-admin配置动态菜单,菜单数据从后台获取. 我在网上search了几个小时也没有找到想要的emm,翻官网也没有说明,只说明了路由覆盖.只 ...

  6. k8s在删除pod时优雅关闭sigterm信号传输失败

    背景 随着云原生技术的流行,越来越多的应用选择容器化,容器化的话题自然离不开 Kubernetes .Pod 是 Kubernetes 中创建和管理的.最小的可部署的计算单元,一个 Pod 中有多个容 ...

  7. 文心一言 VS 讯飞星火 VS chatgpt (46)-- 算法导论6.1 4题

    四.假设一个最大堆的所有元素都不相同,那么该堆的最小元素应该位于哪里? 文心一言: 最大堆的最小元素位于堆的根结点.由于最大堆的性质,根结点是堆中所有元素的最大值,因此它也是堆中所有元素的最小值. 讯 ...

  8. Axure 多平台自适应

    步骤一:设置自适应视图 1.新建两个页面分别命名为"PC版"和"移动版" 2.启动自适应视图: 条件为大于等于,宽为1024,继承于基本视图3.新建自适应视图& ...

  9. AudioLDM 2,加速!

    AudioLDM 2 由刘濠赫等人在 AudioLDM 2: Learning Holistic Audio Generation with Self-supervised Pretraining 一 ...

  10. C++ Lambda 快速上手

    Lambda 听起来非常的牛逼,很容易就会联想到函数式编程或者 Lambda 演算这样的东西.但是在 C++里,没那么复杂,就把它当匿名函数用就好了 HelloWorld 对于降序排序,我们可以这样写 ...