springmvc实现拦截器两种方式_追逐拦截他人的定义

springmvc实现拦截器两种方式_追逐拦截他人的定义SpringMVC拦截器1、什么是拦截器  在系统中,经常需要在处理用户请求之前和之后执行一些行为,例如检测用户的权限,或者将请求的信息记录到日志中,即平时所说的“权限检测”及“日志记录”。当然不仅仅这些,所以需要一种机制,拦截用户的请求,在请求的前后添加处理逻辑。  SpringMVC的拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(InterceptorChain)。在访问被拦截的方法或字段时

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

往期文章

SSM系列笔记整理,往期笔记如下:
Spring01 —— Spring概念及快速入门
Spring02 —— Spring配置文件详解和依赖注入
Spring03 —— SpringAPI和在Spring中配置数据源
Spring04 —— Spring的注解开发
Spring05 —— Spring集成Junit
Spring06 —— Spring集成web环境
SpringMVC01 —— SpringMVC简介&快速入门
SpringMVC02 —— SpringMVC的各组件详解
SpringMVC03 —— Spring的请求和响应
Spring07 —— Spring Jdbctemplate的使用


SpringMVC拦截器

1、什么是拦截器

  在系统中,经常需要在处理用户请求之前和之后执行一些行为,例如检测用户的权限,或者将请求的信息记录到日志中,即平时所说的“权限检测”及“日志记录”。当然不仅仅这些,所以需要一种机制,拦截用户的请求,在请求的前后添加处理逻辑。

  Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。

将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(InterceptorChain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。

2、SpringMVC拦截器和过滤器的区别

在这里插入图片描述

3、SpringMVC拦截器快速入门

自定义拦截器很简单,只有如下三步:

①创建拦截器类实现HandlerInterceptor接口

②配置拦截器

③测试拦截器的拦截效果

1、环境搭建

创建一个module,完善Spring集成web环境

SpringMVC需要配置的首先是注解驱动、视图解析器、静态资源访问权限开放、组件扫描

web.xml主要配置前端控制器 全局乱码过滤器

web层编写一个controller TestController

package com.zhou.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

/** * @author it春和 * @create 2022-04-11 20:15 */
@Controller
public class TestController { 
   

    @RequestMapping("/show")
    public ModelAndView show() { 
   
        System.out.println("目标资源执行!");
        ModelAndView modelAndView = new ModelAndView();
        // 设置模型
        modelAndView.addObject("username", "张无忌");
        // 设置视图
        modelAndView.setViewName("index");
        return modelAndView;
    }
}

Jetbrains全家桶1年46,售后保障稳定

部署测试:

在这里插入图片描述

1、编写自定义的拦截器:

我们去实现handlerinterceptor接口,由于做了默认的实现并不会报错,所以我们需要手动去重写三个方法。

public class MyInterceptor1 implements HandlerInterceptor { 
   
    // 在目标方法执行之前执行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
   
        System.out.println("preHandle执行...");
        return false;
    }

    // 在目标方法执行之后、视图返回之前执行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 
   
        System.out.println("postHandle执行...");

    }

    // 整个流程执行完毕后执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 
   
        System.out.println("afterCompletion执行...");

    }
}

2、在spring-mvc中配置拦截器

<!-- 配置拦截器 -->
<mvc:interceptors>
    <mvc:interceptor>
        <!-- 指定对哪些资源进行拦截操作 -->
        <mvc:mapping path="/**"/>
        <bean class="com.zhou.interceptor.MyInterceptor1"/>
    </mvc:interceptor>
</mvc:interceptors>

3、测试

在这里插入图片描述

在这里插入图片描述

原因在于PreHandle方法返回的false表示不放行,整个流程处于被拦截状态。

将返回值改为true

在这里插入图片描述

当拦截器的preHandle方法返回true则会执行目标资源,如果返回false则不执行目标资源

多个拦截器情况下,配置在前的先执行,配置在后的后执行

拦截器中的方法执行顺序是:preHandler——-目标资源—-postHandle—- afterCompletion

4、拦截器小细节

拦截器我们常用的就只有两个方法

1、preHandle,在该方法中我们可以做一些逻辑的判断

// 在目标方法执行之前执行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
   
    System.out.println("preHandle执行...");
    String name = request.getParameter("name");
    if ("zhangsan".equals(name)){ 
   
        // 放行
        return true;
    }
    // 参数名不匹配则跳转到错误页面
    request.getRequestDispatcher("/error.jsp").forward(request,response);
    return false;
}

访问目标资源的时候需要携带参数,根据参数进行判断

在这里插入图片描述

在这里插入图片描述

2、postHandle方法是在目标方法执行之后执行,在渲染视图之前执行,所以我们可以在这里修改视图。

// 在目标方法执行之后、视图返回之前执行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 
   
    System.out.println("postHandle执行...");
    
    modelAndView.addObject("username","张三");

}

在这里插入图片描述

5、拦截器案例

在Spring综合练习的基础上加上用户登录相关的拦截器,用户没有登录的情况下,不能对后台菜单进行访问操作,点击菜单跳转到登录页面,只有用户登录成功后才能进行后台功能的操作

判断用户登录的本质就是判断session中有没有user,如果没有则跳转到登录页面,如果有则放行

编写拦截器

public class LoginInterceptor implements HandlerInterceptor { 
   
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
   
        // 1、获取session
        HttpSession session = request.getSession();
        // 2、从session中获取user
        User user = (User) session.getAttribute("user");
        // 3、判断
        if (user == null){ 
   
            // session中没有user跳转到登录页面
            response.sendRedirect(request.getContextPath() + "/login.jsp");
            return false;
        }
        // 有用户登录信息 放行
        return true;
    }
}

配置拦截器

找到spring-mvc.xml文件进行配置

<!-- 配置拦截器 -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.itch.test.inteceptor.LoginInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

部署测试

在这里插入图片描述

完善登录相关的代码

dao

/** * 根据用户名密码查询用户 * @param username * @param password * @return */
public User findUserByNameAndPasswd(String username,String password);
public User findUserByNameAndPasswd(String username, String password) { 
   
    User user = null;
    try { 
   
        String sql = "select * from sys_user where username = ? and password = ?";
        user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username, password);
    } catch (DataAccessException e) { 
   
        e.printStackTrace();
    }
    return user;
}

service

public User login(String username,String password);
public User login(String username, String password) { 
   
    return userDao.findUserByNameAndPasswd(username,password);
}

controller

@RequestMapping("/login")
public String login(String username, String password, HttpSession session){ 
   
    User user = userService.login(username, password);
    if (user != null){ 
   
        // 表示能够查询出用户 将查询出来的用户存入session中
        session.setAttribute("user",user);
        return "redirect:/index.jsp";
    }

    return "redirect:/login.jsp";
}

前端代码

修改请求路径

在这里插入图片描述

测试

在这里插入图片描述

  这里点击登录我们会发现并不会发生跳转,这是因为springmvc的拦截器拦截了所有请求,所以我们需要在SpringMVC的配置文件spring-mvc文件中配置不要对登录请求进行拦截操作

<!-- 配置拦截器 -->
<mvc:interceptors>
    <mvc:interceptor>
        <!-- 配置对哪些资源执行拦截操作 -->
        <mvc:mapping path="/**"/>
        <!-- 配置对哪些资源不进行拦截操作 -->
        <mvc:exclude-mapping path="/user/login"/>
        <bean class="com.itch.test.inteceptor.LoginInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

重新部署测试:

在这里插入图片描述

自定义拦截器的步骤:
①创建拦截器类实现HandlerInterceptor接口

②配置拦截器

③测试拦截器的拦截效果

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203633.html原文链接:https://javaforall.net

(0)
上一篇 2025年8月11日 下午9:43
下一篇 2025年8月11日 下午10:22


相关推荐

  • mysql如何修改字段名字_mysql如何修改字段名称

    mysql如何修改字段名字_mysql如何修改字段名称mysql 修改字段名称的方法 执行 ALTERTABLE 表名 CHANGE 旧字段名新字段名新数据类型 语句即可修改字段名称 mysql 修改字段名 ALTERTABLE 表名 CHANGE 旧字段名新字段名新数据类型 altertableta 100 DEFAULT1 2COMMENT 注释

    2026年3月19日
    2
  • 什么是pisa测试_PISA测试是什么?[通俗易懂]

    什么是pisa测试_PISA测试是什么?[通俗易懂]“国际高中指南”,给你国际学校选择一站式教育服务,最新国际学校资讯,最全面国际高中课程详情,都能通过“国际高中指南”为你解决,帮助你第一时间获取国际学校动态。为什么你会为孩子选择国际学校?因为这里的教育模式、课程体系能够帮助孩子更早的确立自己的兴趣爱好甚至未来的发展目标,能够帮助孩子全方位提升阅读能力、逻辑思维、数理分析能力等等。那这些能力可以通过什么方式去衡量呢?PISA测试。【PISA】什么是…

    2022年6月6日
    56
  • js的数组拼接「建议收藏」

    js的数组拼接「建议收藏」js的数组拼接方法方法一:concat方法拼接(返回一个新数组)vara1=[1,2,3,4,5];vara2=[‘a’,’b’,’c’];varnewa=a1.concat(a2);返回结果:{“0″:1,”1″:2,”2″:3,”3″:4,”4″:5,”5″:”a”,”6″:”b”,”7″:”c”,”length”:8}结果类型:objectconcat方法:用于连接两个或多个数组,生成新数组,concat后面的数组时操作的时候数组的元素,而不是数组方.

    2022年6月8日
    114
  • 自建iOS分发平台

    自建iOS分发平台随着 2019 年 11 月蒲公英的系统升级之后 iOS 免费分发平台越来越少 越来越不方便 如果不介意上传手持身份证的同学可以接着只有 fir im 单从蒲公英开始限制权限和收费这件事不难看出 免费分发平台似乎走到了尽头 是该考虑自己搭建一个 iOS 分发平台了 如果嫌麻烦的话可以找一下收费的平台也是不错的选择 在文章的最后附带了一些收费的分发平台 有兴趣的同学可以看一下 接下来就讲一下自己搭建 iOS 分发平台

    2026年3月20日
    1
  • python中if的用法例子_python中while的意思是

    python中if的用法例子_python中while的意思是一、if判断语句if语句是用来进行判断的,其使用格式如下:if要判断的条件:条件成立时,要做的事情else这里写代码片否者要做的事情二、框图三、参考代码:chePiao=1ifchePiao==1:print("hell")else:print("hell…

    2026年4月14日
    7
  • 朴素贝叶斯分类

    朴素贝叶斯分类

    2022年1月31日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号