SpringMVC(六)拦截器

目录

1.什么是拦截器

2.拦截器和过滤器有哪些区别

3.拦截器方法

4.单个拦截器的执行流程

5.使用拦截器实现用户登录权限验证(实例)

1.先在html目录下写一个login.html文件

2.在controller包下写一个LoginController文件

3.加拦截器

1.创建一个config-LoginInterceptor文件:

2在springMV.xml文件当中配置拦截器

3.重启服务器测验

6.多个拦截器的执行流程


1.什么是拦截器

SpringMVC提供了Intercepter拦截器机制,类似于Servlet当中的Filter过滤器,用于拦截用户的请求并作出相应的处理,比如通过拦截器来进行用户权限验证或者用来判断用户是否登录。SpringMVC拦截器是可插拔式的设计,需要某一功能拦截器,就需要在配置文件中应用拦截器即可;如果不需要这个功能拦截器,只需要在配置文件中取消该拦截器即可。

2.拦截器和过滤器有哪些区别

请求从外向内打到Controller层,Filter起到了对请求的最基础的过滤;Interceptor是拦截器。

1.过滤器依赖于servlet,而拦截器技术属于SpringMVC

2.过滤器可对所有请求起作用,拦截器只对访问controller层的请求起作用。

3.过滤器会比拦截器先执行。拦截器(Interceptor)是在Servlet和Controller控制器之间执行;而过滤器(Filter)是在请求进入Tomcat容器之后 但是在请求进入Servlet之前执行。

3.拦截器方法

想要自定义拦截器,需要实现HandlerInterceptor接口。

我们可以看到 HandlerInterceptor接口有三个方法,分别是preHandle、postHandle、afterCompletion,关于这三个方法**(拦截器就是实现这三个方法)**

  • preHandle 方法:该方法在执行器方法之前执行。返回值为Boolean类型,如果返回false,表示拦截,不再向下执行;如果返回true,表示放行,程序向下执行(如果后边没有其他Interceptor,就会执行Controller方法)。所以,此方法可对方法进行判断,决定程序是否继续执行,或者进行一些初始化操作及对请求进行预处理。
  • postHandle方法:**该方法在执行控制器方法调用之后,且在返回ModelAndView之前执行。**由于该方法会在DispatcherServlet进行返回视图渲染之前被调用,所以此方法多被用于处理返回的视图,可通过此方法多被用于处理返回的视图,可通过此方法对请求域中的模型和视图做进一步的修改。
  • afterCompletion方法:该方法在执行完控制器之后执行。由于是在Controller方法执行完毕之后执行该方法,所以该方法适合进行一些资源清理、记录日志信息等处理操作。

4.单个拦截器的执行流程

程序首先会执行拦截器类中的preHandle()方法,如果该方法的返回值true,则程序继续向下执行处理器当中的方法,否则不在向下执行;业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后会通过DispatcherServlet向前端返回响应;在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。

5.使用拦截器实现用户登录权限验证(实例)

当前用的项目还是之前配置的:

1.先在html目录下写一个login.html文件

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
<form action="/StringMVCTestTwice/login/login" method="post">
    name:<input type="text" name="name"/>
    password:<input type="password" name="password"/>
    <input type="submit" value="登录"/>
</form>
</body>
</html>

2.在controller包下写一个LoginController文件

java 复制代码
package controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.servlet.http.HttpSession;

@Controller
@RequestMapping("/login") //一级请求
public class LoginController {

    @RequestMapping("/toLogin")
    public String toLogin(){
        return "login";
    }


    @RequestMapping(value = "/login",method = {RequestMethod.POST})//二级请求(注意这里是get/post都可以,主要是要和前端中相对应)
    public String login(String name,String password,HttpSession session){
        if(name.equals("admin")&&password.equals("123456")){
            return "test"; //随便选一个假设测试即可
        }else{
            return "login";
        }

    }

}

这两个就实现了一个普通简单逻辑的登陆界面,现在去加上拦截器:

3.加拦截器

1.创建一个config-LoginInterceptor文件:

并配置代码:

java 复制代码
package config;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//登录拦截类
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取请求url
        String url = request.getRequestURI();
        //非登录请求进行拦截
        if (!url.contains("login")){
            //非登录请求获取session
            if(request.getSession().getAttribute("key") != null){ //和创建的session值相对应
                return true;//说明已经登录,放行
            }else { //没有登录,跳转到登录页面
                request.setAttribute("msg","您还没登录。请先登录。。。");
                request.getRequestDispatcher("/html/login.html").forward(request,response);
            }
        }else {
            return true; //登录请求,放行
        }
        return true;
    }
    //省略了postHandle()和afterCompletion()方法
}

2在springMV.xml文件当中配置拦截器

html 复制代码
 <!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/> <!--/**表示所有url-->
            <bean class="config.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

3.重启服务器测验

此时只要不是login路径下且未登录过的页面或请求一律拦截并且跳转到login.html界面:

正常登录后,跳转到test.html界面:

此时登录过一遍后,带有了session值,此刻再点击进入其他界面,就能直接进入了:

6.多个拦截器的执行流程

当多个拦截器同时工作时,它们的preHandle()方法会按照配置文件中拦截器的配置顺序执行,而它们的postHandle()方法和afterCompletion()方法则会按照配置顺序的反序执行。

假设有两个拦截器Interceptor1和interceptor2,并且在配置文件中,Interceptor1拦截器配置在前。

相关推荐
程序定小飞3 小时前
基于springboot的学院班级回忆录的设计与实现
java·vue.js·spring boot·后端·spring
郝开4 小时前
Spring Boot 2.7.18(最终 2.x 系列版本)1 - 技术选型:连接池技术选型对比;接口文档技术选型对比
java·spring boot·spring
知兀5 小时前
【Spring/SpringBoot】SSM(Spring+Spring MVC+Mybatis)方案、各部分职责、与Springboot关系
java·spring boot·spring
伊布拉西莫7 小时前
Spring 6.x HTTP interface 使用说明
spring·restclient
YDS8299 小时前
苍穹外卖 —— Spring Cache和购物车功能开发
java·spring boot·后端·spring·mybatis
Elieal9 小时前
Spring 框架核心技术全解析
java·spring·sqlserver
组合缺一9 小时前
(对标 Spring)OpenSolon v3.7.0, v3.6.4, v3.5.8, v3.4.8 发布(支持 LTS)
java·后端·spring·web·solon
♡喜欢做梦9 小时前
Spring IOC
java·后端·spring
葡萄城技术团队19 小时前
迎接下一代 React 框架:Next.js 16 核心能力解读
javascript·spring·react.js
灰小猿20 小时前
Spring前后端分离项目时间格式转换问题全局配置解决
java·前端·后端·spring·spring cloud