【SpringMVC】SpringMVC 拦截器
SpringMVC 拦截器
拦截器的作用
SpringMVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
谈到拦截器,还有另外一个概念 —— 拦截器链(Interceptor Chain)。拦截器链就是将拦截器按一定的顺序联结成一条链,在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
处理器拦截器和过滤器的异同:
- 过滤器是 Servlet 规范中的一部分,任何 JavaWeb 工程都可以使用。而拦截器是 SpringMVC 框架独有的,只有使用了 SpringMVC 框架的工程才能使用。
- 过滤器在
url-pattern中配置了/*之后,可以对所有要访问的资源拦截。而拦截器它是只会拦截访问的控制器方法,如果访问的是静态资源则不会进行拦截。
自定义拦截器,要求必须实现 HandlerInterceptor 接口。
自定义拦截器
第一步 编写一个普通类实现 HandlerInterceptor 接口:
/**
* @Author : parzulpan
* @Time : 2020-12
* @Desc : 自定义拦截器
*/
public class CustomInterceptor1 implements HandlerInterceptor {
/**
* 预处理,Controller 方法执行前
* 可以使用转发或者重定向直接跳转到指定的页面
* @param request
* @param response
* @param handler
* @return true 代表放行,执行下一个拦截器,如果没有则执行 Controller 中的方法;false 代表不放行
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("called CustomInterceptor1 preHandle...");
// request.getRequestDispatcher("/WEB_INF/views/error.jsp").forward(request, response);
return true;
}
/**
* 后处理,Controller 方法执行后,success.jsp 执行前
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("called CustomInterceptor1 postHandle...");
// request.getRequestDispatcher("/WEB_INF/views/error.jsp").forward(request, response);
}
/**
* success.jsp 执行后
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("called CustomInterceptor1 afterCompletion...");
}
}
第二步 配置拦截器:
<!-- 配置 处理器拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/> <!-- 要拦截的方法 -->
<!-- <mvc:exclude-mapping path="/**"/> 不要拦截的方法 -->
<bean id="customInterceptor1" class="cn.parzulpan.interceptor.CustomInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
第三步 测试结果:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>拦截器的使用</title>
</head>
<body>
<a href="user/testInterceptor">拦截器的使用</a>
</body>
</html>
输出:
called CustomInterceptor1 preHandle...
called testInterceptor...
called CustomInterceptor1 postHandle...
called success.jsp ...
called CustomInterceptor1 afterCompletion...
拦截器的细节
- preHandle 方法:
- 按拦截器定义顺序调用
- 只要配置了就会调用
- 如果决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回 true。如果决定不需要再调用其他的组件去处理请求,则返回 false。
- postHandle 方法:
- 按拦截器定义逆序调用
- 在拦截器链内所有拦截器返回 true 就会调用
- 在业务处理器处理完请求后,但是 DispatcherServlet 向客户端返回响应前被调用,可以在该方法中对用户请求 request 进行处理
- afterCompletion 方法:
- 按拦截器定义逆序调用
- 只有 preHandle 返回 true 才调用
- 在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作
多个拦截器的执行顺序:
假设多个拦截器配置为:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean id="customInterceptor1" class="cn.parzulpan.interceptor.CustomInterceptor1"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean id="customInterceptor2" class="cn.parzulpan.interceptor.CustomInterceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
则 执行顺序为:

拦截器的简单使用
需求:
验证用户是否登录
实现:
- 1、有一个登录页面,需要写一个 controller 访问页面
- 2、登录页面有一提交表单的动作,需要在 controller 中处理。
- 2.1、判断用户名密码是否正确
- 2.2、如果正确 向 session 中写入用户信息
- 2.3、返回登录成功。
- 3、拦截用户请求,判断用户是否登录
- 3.1、如果用户已经登录。放行
- 3.2、如果用户未登录,跳转到登录页面
用户登录控制器 LoginController.java
/**
* @Author : parzulpan
* @Time : 2020-12
* @Desc : 用户登录控制器
*/
@Controller
public class LoginController {
/**
* 登录页面
* @param model
* @return
* @throws Exception
*/
@RequestMapping("/login")
public String login(Model model) throws Exception {
System.out.println("called login...");
return "login";
}
/**
* 提交登录
* @param session
* @param username
* @param password
* @return
* @throws Exception
*/
@RequestMapping("/loginSubmit")
public String loginSubmit(HttpSession session, String username, String password) throws Exception {
System.out.println("called loginSubmit...");
System.out.println(username + " " + password);
session.setAttribute("activeUser", username); // 向 session 记录用户身份信息
return "forward:/WEB-INF/views/main.jsp";
}
/**
* 退出登录
* @param session
* @return
* @throws Exception
*/
@RequestMapping("logout")
public String logout(HttpSession session) throws Exception {
System.out.println("called logout...");
session.invalidate(); // 设置 session 过期
return "redirect:/index.jsp";
}
/**
* 测试页面
* @return
* @throws Exception
*/
@RequestMapping("/test")
public String test() throws Exception {
System.out.println("called test...");
return "test";
}
用户登录拦截器 LoginInterceptor.java
/**
* @Author : parzulpan
* @Time : 2020-12
* @Desc : 用户登录拦截器
*/
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("called LoginInterceptor preHandle...");
//如果是登录页面则放行
if (request.getRequestURI().contains("login")) {
System.out.println("登录页面");
return true;
}
// 如果用户已登录则放行
HttpSession session = request.getSession();
if (session.getAttribute("activeUser") != null) {
System.out.println("用户已登录");
return true;
}
// 用户没有登录跳转到登录页面
System.out.println("用户没有登录");
request.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(request, response);
return false;
}
}
views 页面
src/main/webapp/WEB-INF/views/login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
欢迎登录~
<br>
<form action="loginSubmit" method="post">
用户名:<input type="text" name="username"/><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
src/main/webapp/WEB-INF/views/main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页</title>
</head>
<body>
恭喜您,登录成功~
<br>
<a href="logout">退出登录</a>
<a href="test">进入测试页面</a>
</body>
</html>
src/main/webapp/WEB-INF/views/test.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
我已登录,可以进入测试页面~
<br>
<a href="logout">退出登录</a>
</body>
</html>
测试页面
src/main/webapp/index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>拦截器的使用</title>
</head>
<body>
<a href="login">用户登录</a>
<a href="test">测试页面</a>
</body>
</html>
练习和总结
【SpringMVC】SpringMVC 拦截器的更多相关文章
- springmvc的拦截器
什么是拦截器 java里的拦截器是动态拦截action调用的对象.它提供了一种机制可以使 ...
- SpringMVC利用拦截器防止SQL注入
引言 随着互联网的发展,人们在享受互联网带来的便捷的服务的时候,也面临着个人的隐私泄漏的问题.小到一个拥有用户系统的小型论坛,大到各个大型的银行机构,互联网安全问题都显得格外重要.而这些网站的背后,则 ...
- SpringMVC经典系列-14自己定义SpringMVC的拦截器---【LinusZhu】
注意:此文章是个人原创.希望有转载须要的朋友们标明文章出处.假设各位朋友们认为写的还好,就给个赞哈.你的鼓舞是我创作的最大动力,LinusZhu在此表示十分感谢,当然文章中如有纰漏,请联系linusz ...
- 基于注解风格的Spring-MVC的拦截器
基于注解风格的Spring-MVC的拦截器 Spring-MVC如何使用拦截器,官方文档只给出了非注解风格的例子.那么基于注解风格如何使用拦截器呢? 基于注解基本上有2个可使用的定义类,分别是Defa ...
- SpringMVC 学习-拦截器 HandlerInterceptor 类
一.拦截器 HandlerInterceptor 类的作用 SpringMVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 二.怎么使用呢? 1. ...
- springMVC的拦截器工作流程
首先,springmvc的拦截器配置在这就不多说了.主要讲一下拦截器的三个方法的执行顺序. preHandle方法一定是最先执行的方法,如果它返回为false下面的方法均不执行. postHandle ...
- SpringMVC—Struts2拦截器学习网址整理
引自:http://blog.csdn.net/wp1603710463/article/details/49982683 SpringMVC—Struts2拦截器学习网址整理 最近项目中遇到权限相关 ...
- 转 :关于springmvc使用拦截器
原博客: http://elim.iteye.com/blog/1750680 SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的 ...
- springmvc中拦截器与springmvc全局异常处理器的问题
最近在做一个练手的小项目, 系统架构中用了springmvc的全局异常处理器, 做了系统的统一异常处理. 后来加入了springmvc的拦截器, 为了一些需求, 在拦截器中的 preHandle 方法 ...
- springMVC配置拦截器、过滤器、前端控制器时遇到的问题总结
1.业务场景:使用vuejs+springMVC+spring框架搭建一个mis系统,集成SSO单点登录: 2.遇到问题:使用interceptor拦截器配置SSO单点登录,直接敲域名,或者ip+端口 ...
随机推荐
- 落谷 P2401 不等数列
题目链接. Solution 状态设计 设 \(f_{i, j}\) 为 \(1\) 到 \(i\) 的排列,其中有 \(j\) 个 \(\text{'<'}\) 的方案数. 状态转移 尝试从 ...
- window+nginx+php
今天在Windows上配置了下nginx,看了不少其他大牛们记录的博客,自己也操作了一番,记录一下备忘. nginx download: http://nginx.org/en/download.ht ...
- oracle 11.2.0.4下载
Oracle 11.2.0.4下载地址 Linux x86: https://updates.oracle.com/Orion/Services/download/p13390677_112040_L ...
- 快用Django REST framework写写API吧
Django默认是前后端绑定的,提供了Template和Form,现在流行前后端分离项目,Python大佬坐不住了,于是便有了Django REST framework:https://github. ...
- XSS攻击与防止
1.XSS又称CSS, cross sitescript, 跨站脚本攻击,是web程序中常见的漏洞 XSS属于被动式且用于客户端的攻击方式 XSS攻击类似于SQL注入攻击,攻击之前,我们先找到一个存在 ...
- matplotlib的学习16-animation动画
from matplotlib import pyplot as plt from matplotlib import animation import numpy as np fig, ax = p ...
- c语言实现一些简单图形的打印
1 #define _CRT_SECURE_NO_WARNINGS 1 因为笔者采用的是VS的编译环境所以有了上面的这一句话 我们都知道平面图形是由一条条线段构成,所以我们就先实现线段的打印 1 // ...
- vulstudy靶机搭建(kali)
安装 安装docker apt-get install docker.io //# 安装docker pip install docker-compose //# 安装docker-compose g ...
- js 根据条件删除数组中某个对象&js filter (find)过滤数组对象的使用
删除 ---- item不设置 arr.splice(1,1) //['a','c','d'] 删除起始下标为1,长度为1的一个值,len设置的1,如果为0,则数组不变 arr. ...
- 【Windows系统常用命令集合】
查看建立的TCP连接:netstat -n 查看建立的TCP连接的进程:netstat -nb 查看本机侦听的端口: netstat -an (说明:如果端口没有侦听 检查服务) 测试到远程计算机的某 ...