17 spring项目——登录拦截器

news2024/11/13 9:34:22

        经实验发现,当访问拦截器拦截的地址的时候都会经过拦截器。在拦截器中,返回true则放行,允许访问该地址;返回false,则拦截,不允许访问该地址,但可以在return前去设置要跳转的地址。

        拦截器可以拦截请求和资源(就是一个访问静态资源的请求)!

17.1 在config包中创建拦截器对象LoginHandleInterceptor

        该类继承了HandleInterceptor,并重写了里面的preHandle方法。拦截器通过判断session中的转发数据loginUser的值是否为空来判断是否对该请求进行拦截。如果为空,则说明需要拦截该请求,设置转发消息,并跳转和转发到其他地址。如果不为空,则放行。

package jiang.com.springbootstudy.config;

import org.springframework.web.servlet.HandlerInterceptor;

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

public class LoginHandleInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //登录成功后应该有用户的session
        Object loginUser = request.getSession().getAttribute("loginUser");// 从request中拿session,从session中拿到名为loginUser的值
        if (loginUser==null){ // 如果loginUser被赋予的值为空
            request.setAttribute("msg","没有权限,请先登录"); // 在request中设置转发数据
            request.getRequestDispatcher("/index.html").forward(request,response); //跳转到index.html。并转发request的数据到response
            return false;  // 拦截此请求
        }else{
            return true;  // 放行此请求
        }
    }
}

17.2 修改LoginController类

        当登录成功时,将loginUser传到session中,17.1的拦截器依据session的loginUser的值是否为空来判断是否拦截某个请求。

package jiang.com.springbootstudy.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.thymeleaf.util.StringUtils;

import javax.servlet.http.HttpSession;

@Controller
public class LoginController {
    @RequestMapping("/user/login")
    public String login(@RequestParam("username") String username,
                        @RequestParam("password") String password,
                        Model model,
                        HttpSession session){
        if (!StringUtils.isEmpty(username)&&"123456".equals(password)){
            session.setAttribute("loginUser",username); //如果登录成功把loginUser放到session中,对应的值是username
            return "redirect:/main.html";  // 每次要跳转到其他地址之前,先经过拦截器看看是否拦截该请求
        }else {
            model.addAttribute("msg","用户名或密码错误!");
            return "index";  // 每次要跳转到其他地址之前,先经过拦截器,看看是否拦截该请求
        }

    }
}

17.3 修改config包中的MyMvcConfig配置类

        重写WebMvcConfigurer的addInterceptor方法。该方法可以设置需要拦截的请求以及放行的请求。通过调用registry的addInterceptor方法新建一个17.1的拦截器作为入参传入,然后调用addPathPatterns方法填入需要拦截的请求,最后调用excludePathPatterns方法填入运行放行的请求,请求之间用逗号隔开。

package jiang.com.springbootstudy.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;


@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");  //setViewName后面不用加html
        registry.addViewController("/index.html").setViewName("index");
        registry.addViewController("/main.html").setViewName("dashboard"); // 前面的main.html是假的,只是一种请求,后面才是真的,输入请求后会跳转的地方是后面的html
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginHandleInterceptor()).addPathPatterns("/**").excludePathPatterns("/index.html","/user/login","/","/css/**","/img/**","/js/**"); // 拦截所有请求,放行index.html、user/login请求、/请求以及静态资源(看成是请求就行)
    }
}

17.4 拦截器使用

        访问一个拦截的地址:local:8080/main.html:

        访问一个放行地址:正常放行。

         当输入错误的密码,点击sign in会跳转到local:8080/user/login,由于local:8080/user/login地址是运行通行的,在登录成功时,会跳转到local:8080/main.html页面,在登录失败的时候会跳转到local:8080/index页面,这两个跳转的页面都是运行通行的,不会经过拦截器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/856357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【二分】CF1623 C

Problem - 1623C - Codeforces 题意: 思路: 肯定是二分,我们去二分最小值,然后check的时候最小值要大于mid check的时候要让最小值尽可能大 注意到我们不需要去管最大值,只需要最小值尽可能大就好了,因…

Creo散热处理结构设计--阵列操作

问题描述: 在某一平面掏孔以散热,如何快速的绘制多孔并掏空处理 解决方式: 采用阵列操作。 1)绘制圆、拉伸处理 2)选择需要阵列的单元,选择阵列操作,在弹出的界面选择方向,按照…

BigDecimal(double)和BigDecimal(String)有什么区别?

面试回答 有区别,而且区别很大。 因为double是不精确的,所以使用一个不精确的数字来创建 BigDecimal,得到的数字也是不精确的。如 0.1 这个数字,double 只能表示他的近似值。 所以,当我们使用 new BigDecimal(0.1) 创建…

SwiftUI 兼容 Light Dark

1. Assets 右键 New Color Set 2. 起个合适的颜色名称,修改一下 demo_bgcolordemo_card_bgcolordemo_text_color 3. Show Me The Code // // light_dark_demo.swift // bill2 // // Created by 朱洪苇 on 2023/8/10. //import SwiftUIstruct light_dark_demo: …

机器学习---自编码器

自编码器过程 输入一个图片,经过encoder变成一个向量,再通过decoder将这个向量反向生成输入的图片。 这里我们希望输入和输出越接近越好。这个过程我们称为重建。 特点:不需要任何的标注资料。 在2006年这个思想就被提出来了: …

消息队列比较

、ActiveMQ 优点:单机吞吐量万级,时效性ms级,可用性高,基于主从架构实现高可用性,消息可靠性较低的概率丢失数据。 缺点:官方社区现在对ActiveMQ5.X维护越来越少了,高吞吐量场景较少使用。 2、K…

《Linux从练气到飞升》No.10 冯洛依曼体系结构

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…

rust关于项目结构包,Crate和mod和目录的组织

rust 最近开始学习rust语言。感觉这门语言相对java确实是难上很多。开几个文章把遇到的问题记录一下 rust关于包,Crate 关于包,Crate这块先看看官方书籍怎么说的 crate 是 Rust 在编译时最小的代码单位。如果你用 rustc 而不是 cargo 来编译一个文件…

Opencv实战(银行卡识别)

目录 模版匹配不同方法对比一个模板匹配多个 直方图及直方图均衡化Mask操作直方图均衡化自适应直方图均衡化 模版匹配 公式 import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %matplotlib inline def cv_show(img,nam…

win10 + VS2022 安装opencv C++

最近需要用到C opencv,看了很多帖子都需要自己编译opencv源码。为避免源码编译,可以使用VS来配置opencv C。下面是主要过程: 目录 1. 从官网下载 opencv - Get Started - OpenCV 2. 点击这个exe文件进行安装 3. 配置环境变量 4. VS中的项…

【数据结构与算法】多路查找树

多路查找树 二叉树的问题分析 二叉树的操作效率较高,但也存在问题。 二叉树需要加载到内存的,如果二叉树节点少,没什么问题,但是如果二叉树的节点很多(比如 1 亿),就存在如下问题&#xff1a…

【信号生成器】从 Excel 数据文件创建 Simulink 信号生成器块研究(Simulink)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

深度学习:使用卷积神经网络CNN实现MNIST手写数字识别

引言 本项目基于pytorch构建了一个深度学习神经网络,网络包含卷积层、池化层、全连接层,通过此网络实现对MINST数据集手写数字的识别,通过本项目代码,从原理上理解手写数字识别的全过程,包括反向传播,梯度…

selenium爬虫,配置谷歌浏览器的driver

用selenium爬虫时,明明已经安装了selenium模块,程序却运行不了 本文主要涉及驱动有问题driver 网上有很多手动的方法(查看谷歌浏览的版本然后在其他博主分享的webdriver中下载与自己谷歌版本号最贴近的版本号,并把webdriver的地址…

AtuoDL----Tensorboard可视化使用

本教程教你怎么在autodl上使用tensorboard。 1、保存tensorboard日志文件 修改保存日志文件的路径,只有在这个tf-logs下的日志文件才能显示 2、查看tensorboard 进入AutoPanel,点击Tensorboard就能查看

跟禹神VUE——组件间的通信方式(props配置项、组件间自定义事件、全局事件总线、消息订阅与发布、VUEX)

一、通过props配置项传递数据&#xff08;适用于父组件给子组件传递数据&#xff09; 父组件向子组件传递数据&#xff1a; 父组件代码&#xff1a;在子组件的标签中传递数据 <template><div><h2>学校名称&#xff1a;{{schoolName}}</h2><!-- 方…

ROS入门核心教材重要节选

ROS核心教程 1、文件系统 使用下述命令查看包 rospack ros pack(age&#xff09; 如rospack find roscpp roscd ros cd 如roscd roscpp rosls ros ls 如rosls roscpp2、ROS节点 节点可以理解为人工定义一个机器人模块&#xff0c;然后抽象成可执行文件。 rosnode li…

改进DevSecOps框架的 5 大关键技术

Markets and Markets的一项研究显示&#xff0c;全球DevOps的市场规模从2017年的29亿美元增加到2023年的103.1亿美元&#xff0c;预测期的年复合增长率(CAGR)为24.7%。人们对DevOps越来越感兴趣&#xff0c;因为DevOps不仅能够压缩软件的交付周期&#xff0c;还能提高交付的速度…

7.8 封装详解

7.8 封装详解 就是把东西装进箱子里&#xff0c;只留一个口&#xff0c;比如我们看电视的时候我们只用遥控器换一个台就行了&#xff0c;不需要知道电视里面是怎么构造的&#xff0c;电视机使用的厂家为了使用方便就把电视机内部的组件全部封装在了壳子里&#xff0c;只给我们…

Web-WebApp Vue.js 目录结构

WebApp Vue.js 目录结构 目录解析 目录/文件 说明 build 最终发布的代码存放位置。config 配置目录&#xff0c;包括端口号等。我们初学可以使用默认的。node_modules npm 加载的项目依赖模块 src 这里是我们要开发的目录&#xff0c;基本上要做的事情都在这个目录里。里面包…