【springmvc】——拦截器

2024-08-25 21:08

本文主要是介绍【springmvc】——拦截器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


    定义

    定义拦截器,实现HandlerInterceptor接口。接口中提供三个方法

package cn.itcast.ssm.interceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;/*** 测试拦截器1* @author wrx**/
public class HandlerInterceptor1 implements HandlerInterceptor{//进入 Handler方法之前执行//用于身份认证、身份授权//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {System.out.println("HandlerInterceptor1...preHandle");//return false表示拦截,不向下执行//return true表示放行return true;}//进入Handler方法之后,返回modelAndView之前执行//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图@Overridepublic void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("HandlerInterceptor1...postHandle");}//执行Handler完成执行此方法//应用场景:统一异常处理,统一日志处理@Overridepublic void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println("HandlerInterceptor1...afterCompletion");}
}

    配置

    针对HandlerMapping配置

    springmvc拦截器针对HandlerMapping进行拦截设置,如果在某个HandlerMapping中配置拦截,经过该 HandlerMapping映射成功的handler最终使用该 拦截器。

<beanclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"><property name="interceptors"><list><ref bean="handlerInterceptor1"/><ref bean="handlerInterceptor2"/></list></property>
</bean><bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/><bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>

    一般不推荐使用。


    类似全局的拦截器

    springmvc配置类似全局的拦截器,springmvc框架将配置的类似全局的拦截器注入到每个HandlerMapping中。

	<!--拦截器 --><mvc:interceptors><!--多个拦截器,顺序执行 --><!-- 登陆认证拦截器 --><mvc:interceptor><mvc:mapping path="/**"/><bean class="cn.itcast.ssm.interceptor.LoginInterceptor"></bean></mvc:interceptor><mvc:interceptor><!-- /**表示所有url包括子url路径 --><mvc:mapping path="/**"/><bean class="cn.itcast.ssm.interceptor.HandlerInterceptor1"></bean></mvc:interceptor><mvc:interceptor><mvc:mapping path="/**"/><bean class="cn.itcast.ssm.interceptor.HandlerInterceptor2"></bean></mvc:interceptor>
</mvc:interceptors>

    测试

    测试多个拦截器各个方法执行时机

    编写两个拦截

    在项目中,小编添加了两个拦截器类:HandlerInterceptor1和HandlerInterceptor2


    两个拦截器都放行

    运行输出结果:

    HandlerInterceptor1...preHandle
    HandlerInterceptor2...preHandle


    HandlerInterceptor2...postHandle
    HandlerInterceptor1...postHandle


    HandlerInterceptor2...afterCompletion
    HandlerInterceptor1...afterCompletion

    总结:

    preHandle方法按顺序执行,
    postHandle和afterCompletion按拦截器配置的逆向顺序执行。


    拦截器1放行,拦截器2不放行

    HandlerInterceptor1...preHandle
    HandlerInterceptor2...preHandle
    HandlerInterceptor1...afterCompletion

    总结:

    拦截器1放行,拦截器2 preHandle才会执行。 

    拦截器2 preHandle不放行,拦截器2 postHandle和afterCompletion不会执行。

    只要有一个拦截器不放行,postHandle不会执行。


    拦截器1不放行,拦截器2不放行

    HandlerInterceptor1...preHandle

    拦截器1 preHandle不放行,postHandle和afterCompletion不会执行。

    拦截器1 preHandle不放行,拦截器2不执行。


    应用(登录认证)

    controller方法

package cn.itcast.ssm.controller;import javax.servlet.http.HttpSession;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class LoginController {// 登陆@RequestMapping("/login")public String login(HttpSession session, String username, String password)throws Exception {// 调用service进行用户身份验证// ...// 在session中保存用户身份信息session.setAttribute("username", username);// 重定向到商品列表页面return "redirect:/items/queryItems.action";}// 退出@RequestMapping("/logout")public String logout(HttpSession session) throws Exception {// 清除sessionsession.invalidate();// 重定向到商品列表页面return "redirect:/items/queryItems.action";}}

    登录认证拦截

public class LoginInterceptor implements HandlerInterceptor {//进入 Handler方法之前执行//用于身份认证、身份授权//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {//获取请求的urlString url = request.getRequestURI();//判断url是否是公开 地址(实际使用时将公开 地址配置配置文件中)//这里公开地址是登陆提交的地址if(url.indexOf("login.action")>=0){//如果进行登陆提交,放行return true;}//判断sessionHttpSession session  = request.getSession();//从session中取出用户身份信息String username = (String) session.getAttribute("username");if(username != null){//身份存在,放行return true;}//执行这里表示用户身份需要认证,跳转登陆页面request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);//return false表示拦截,不向下执行//return true表示放行return false;}
}



这篇关于【springmvc】——拦截器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1106656

相关文章

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Kafka拦截器的神奇操作方法

《Kafka拦截器的神奇操作方法》Kafka拦截器是一种强大的机制,用于在消息发送和接收过程中插入自定义逻辑,它们可以用于消息定制、日志记录、监控、业务逻辑集成、性能统计和异常处理等,本文介绍Kafk... 目录前言拦截器的基本概念Kafka 拦截器的定义和基本原理:拦截器是 Kafka 消息传递的不可或缺

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Spring MVC如何设置响应

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Spring核心思想之浅谈IoC容器与依赖倒置(DI)

《Spring核心思想之浅谈IoC容器与依赖倒置(DI)》文章介绍了Spring的IoC和DI机制,以及MyBatis的动态代理,通过注解和反射,Spring能够自动管理对象的创建和依赖注入,而MyB... 目录一、控制反转 IoC二、依赖倒置 DI1. 详细概念2. Spring 中 DI 的实现原理三、