零基础入门SpringMVC * 的配置与使用
作者:羡羡ˇ 发布时间:2023-07-17 21:59:28
在SpringMVC中 我们说到了 * , 它会在映射处理器(HandleMapping)执行时检查我们
访问的地址是否配置 * , 在 * 中实现一些功能
SpringMVC 定义了 * 接口 HandlerInterceptor该接口中定义了三个方法,这三个方法的调用时在 SpringMVC 框架内部完成的, 调用这个三个方法的时候,其参数的值也是从框架内部传递进来的。
首先我们来看第一个方法 : boolean preHandle()
预处理方法,实现处理器(Controller层, 控制器)方法的预处理,就是在处理器方法执行之前这个方法会被行,相当于拦截了处理器方法,框架会传递请求和响应对象给该方法,第三个参数为被拦截的处理器方法。如果 preHandle 方法返回 true 表示继续流程(如调用下一个 * 或处理器方法),返回 false 表示流程中断,不会继续调用其他的 * 或处理器方法,此时我们需要通过 response 来产生响应;
意思就是说呢 , 当请求到达我们控制层方法时, 会先进入这个方法中, 根据preHandle() 方法的
返回结果(true 和 false) 来决定下一步如何执行
后两个方法 : void postHandle()
afterCompletion()
首先第一个方法是控制层方法执行后会执行, 第二个方法时整个请求结束后执行, 因为版本原因, 这两个方法的使用频率较低, 所以这里我们做一个了解即可
接着我们去搭建一个 * 看看到底是怎么一回事
//自己编写一个类PreInterceptor 实现 HandlerInterceptor接口 , 重写preHandle方法
public class PreInterceptor implements HandlerInterceptor {
//此方法返回true ,请求才能顺利到达相应的处理方法中,否则会被拦截
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
//第三个参数为目标控制器对象
HttpSession session= request.getSession();
//判断信息是否有效
Admin admin = (Admin) session.getAttribute("admin");
if (admin==null){
response.getWriter().print(202);
return false;
}else {
return true;
}
}
}
接着需要去配置文件中配置 *
<!--配置 * -->
<mvc:interceptors>
<mvc:interceptor>
<!--所有请求都进入 * -->
<mvc:mapping path="/**"/>
<!--指定哪些请求不进入 * -->
<mvc:exclude-mapping path="/login/login"/>
<mvc:exclude-mapping path="/css/**"/>
<mvc:exclude-mapping path="/images/**"/>
<mvc:exclude-mapping path="/js/**"/>
<mvc:exclude-mapping path="/**.html"/>
<!-- * 实现类-->
<bean id="login" class="com.ff.ssm.util.PreInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
这里我们以后端登录 的控制器为例
@RestController
@RequestMapping(value = "/login")
public class LoginController {
@Autowired
LoginService loginService;
@PostMapping(value = "/login")
public CommonResult adminLogin(Admin admin, HttpSession session){
CommonResult commonResult;
try {
Admin admin1 = loginService.login(admin);
if(admin1==null){
commonResult=new CommonResult(201,"账号或密码错误",admin1);
}else {
session.setAttribute("admin",admin1);
commonResult=new CommonResult(200,"登录成功",admin1);
}
}catch (Exception e){
commonResult=new CommonResult(500,"登录失败","");
}
return commonResult;
}
}
如上, 前端发起了登录请求 , 我们配置了 * , 会先进入 * , 根据 preHandle() 方法决定
是否可以进入到我们具体的登录方法中
上述控制器例子是将用户的信息存入了session中 , 我们每次接受前端的请求时, 在 * 中判断用户的信息是否还是有效的 , 有效则放行, 无效则拦截 , 所以前提是我们的登录请求肯定是不能被拦截的, 因为这时候没有登录, 用户信息为 null ,所以上面我们配置了不拦截登录请求, 也不去拦截那些请求页面
来源:https://blog.csdn.net/xx12321q/article/details/124035713
猜你喜欢
- 本文实例为大家分享了java实现递归菜单树的具体代码,供大家参考,具体内容如下1.表结构SET FOREIGN_KEY_CHECKS=0;-
- 在WPF里用MediaElement控件,实现一个循环播放单一视频的程序,同时可以控制视频的播放、暂停、停止。一种方式,使用MediaEle
- 前言:这个语句的作用是,确保该语句执行之后,关闭每一个资源,也就是说它确保了每个资源都在生命周期结束之后被关闭,因此,比如读写文
- 升级到grails 2.3.2之后,运行时报如下的异常:Exception in thread "main"Error
- 前言本文给你提供在Spring Boot 应用程序中编写好的单元测试的机制,并且深入技术细节。我们将带你学习如何以可测试的方式创建Sprin
- resultType和resultMap只能有一个成立,resultType是直接表示返回类型的,而resultMap则是对外部Result
- 一、日志工具功能封装Debug类,需要实现功能:1.控制所有日志是否打印;2.除了Log,Warning,Error外,给更多日志种类(不同
- 本文实例讲述了C#检测是否有u盘插入的方法。分享给大家供大家参考。具体如下:该C#代码可监控是否有u盘插入,同时可以监控其它驱动器的变化us
- 随着对多线程学习的深入,你可能觉得需要了解一些有关线程共享资源的问题. .NET framework提供了很多的类和数据
- JFrame默认的窗体比较土,可以通过一定的美化,让窗体表现的比较漂亮,具体要根据设计的设计图进行美化;JFrame美化的大致思路:先将JF
- 将JavaDoc 注释 生成API文档1. 打开java代码,编写JavaDoc 注释,只有按照java的规范编写注释,才能很好的生成API
- 在面向对象设计原则中,要求"要依赖于抽象,不要依赖于具体", 这句话有很多人搞不懂。在这里谈谈我自己的理解。首先看看以下
- 一、项目简述本系统功能包括:分为前端翻后端部分,包括用户,区分晋通用户以及誉里员用户,包括首页展示,部门管理,人事管理,员工管理三个模块等等
- 使用jni进行opencv开发可以快速地将PC端的opencv代码移植到手机上,但是如何在android studio下进行配置,网上几乎找
- 错误Mybatis-Plus (简称MP) 是mybatis的一个增强工具,在mybatis的基础上只做增强不做改变,简化了开发效率。其实就
- 1.MyBatis中map的应用1.1.应用场景假设,实体类,或者数据库中的表,字段或者参数过多,应当考虑使用Map!!!1.2.具体实现/
- 本文实例为大家分享了android实现录屏小功能的具体代码,供大家参考,具体内容如下思路android实现录屏功能有两种方案,一种是直接使用
- Bean三种自定义初始化和销毁一. 三种方法概述在配置类中指定 @Bean(initMethod = “init&
- 首先要解析string类型的xml必须先要将其转化成dom格式,然后再进行解析取值,如下是解析代码示例:package com.compan
- 简介我们在前面的Android教程中已经提到过这么一件事:Android在启动后会有一个主线程。它不允许任何子线程去改变主UI线程里的内容。