Spring Boot学习篇(十一)

news2024/9/21 8:00:29

Spring Boot学习篇(十一)

shiro安全框架使用篇(三)

1.shiro过滤地址配置(部分地址必须要登录才能访问)

1.1 在controll包下创建CRUDController类(用于提供地址进行测试),其内容如下所示

package com.zlz.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.servlet.http.HttpSession;

//①shiro过滤页面配置步骤一
@Controller
@RequestMapping("product")
public class CRUDController {
    @RequestMapping("find")
    public String find(HttpSession session){
        session.setAttribute("result", "商品查询");
        return "index";
    }
    @RequestMapping("delete")
    public String delete(HttpSession session){
        session.setAttribute("result", "商品删除");
        return "index";
    }
    @RequestMapping("update")
    public String update(HttpSession session){
        session.setAttribute("result", "商品删修改");
        return "index";
    }
    @RequestMapping("insert")
    public String insert(HttpSession session){
        session.setAttribute("result", "商品插入");
        return "index";
    }
}

1.2 变更ShiroConfig代码中的factoryBean方法

1.2.1 需要添加的代码如下所示
Map<String,String> map=new LinkedHashMap<>();
//配置规则 不拦截的(放行的)放上面,拦截的放在下面
//find地址表示不需要登录即可访问,注意这个map.put方法里面的第一个参数也可以是网页如/*.html这种
map.put("/product/find", "anon");
//表示除了find以外的地址,都需要登录才行,相当于先执行前面再去执行后面
map.put("/product/*", "user");
sffb.setFilterChainDefinitionMap(map);
1.2.2 factoryBean方法的完整代码配置如下所示
@Bean("shiroFilterFactoryBean")
    public ShiroFilterFactoryBean factoryBean(){
        ShiroFilterFactoryBean sffb=new ShiroFilterFactoryBean();
        //设置安全管理器
        sffb.setSecurityManager(securityManager());
        //*****设置没有登录时需要跳转的地址
        sffb.setLoginUrl("/sysUser/unlogin");
        //**********过滤器配置(过滤器的地址有很多需要配置,因此需要保证顺序)
        Map<String,String> map=new LinkedHashMap<>();
        /**
         * 一个地址可以执行多个过滤器
         * 常用的几个过滤器
         *    annon 允许匿名访问(不需要登录)
         *    user 需要登录才能访问(包含记住我)
         *    authc 需要登录(强制登录,本次登录是输入密码进入的,不包含记住我)
         *    logout 注销
         *    roles 必须满足指定的所有角色
         *    perms 必须满足指定的所有权限
         */
        //*****规则 不拦截的(放行的)放上面,拦截的放在下面
        //find地址表示不需要登录即可访问
        map.put("/product/find", "anon");
        //表示除了find以外的地址,都需要登录才行,相当于先执行前面再去执行后面
        map.put("/product/*", "user");
        sffb.setFilterChainDefinitionMap(map);
        //检测到没有权限时的跳转地址
//        sffb.setUnauthorizedUrl("");
        return sffb;
    }

1.3 变更SysUserController类

1.3.1 把User对象信息存储到session域中(模拟已登录)
SysUser users = sysUserMapper.findUserByUsername(username);
session.setAttribute("users", users);
1.3.2 增加未登录时的控制器方法
//设置需要登录,但没有登录的方法
 @RequestMapping("unlogin")
 public String unlogin(RedirectAttributes ra){
    ra.addFlashAttribute("msg","请先登录");
    return "redirect:/sysUser/tologin";
 }
1.3.3 增加跳转到登录界面的方法
@RequestMapping("tologin")
public String tologin(){
    return "login";
}

1.3.4 完整的SysUserController类代码如下所示

package com.zlz.controller;

import com.zlz.entity.SysUser;
import com.zlz.mapper.SysUserMapper;
import com.zlz.service.ISysUserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.servlet.http.HttpSession;
@Controller
@RequestMapping("/sysUser")
public class SysUserController {
   @Autowired
   SysUserMapper sysUserMapper;
   @RequestMapping("login")
   public String login(String username, String password, RedirectAttributes ra, HttpSession session){
       //获取当前操作对象
       Subject subject = SecurityUtils.getSubject();
       //把用户名、密码存入token中
       UsernamePasswordToken token=new UsernamePasswordToken(username,password);
       try {
           subject.login(token);
           //*************查到对象后把它放在session里面
           SysUser users = sysUserMapper.findUserByUsername(username);
           session.setAttribute("users", users);
           return "index";
       } catch (UnknownAccountException e) {
           ra.addFlashAttribute("msg", "用户名错误");
       } catch (LockedAccountException e) {
           ra.addFlashAttribute("msg", "该用户被锁定,请联系管理员解锁");
       } catch (IncorrectCredentialsException e) {
           ra.addFlashAttribute("msg", "密码错误");
       }
       //重定向地址栏改变,但因为走的是视图解析器,那么他的地址栏是跟随视图解析器里面的地址栏变化的
       return "redirect:/";
   }
   //***************改动的地方
   @RequestMapping("tologin")
   public String tologin(){
       return "login";
   }
   //设置需要登录,但没有登录的方法
    @RequestMapping("unlogin")
    public String unlogin(RedirectAttributes ra){
       ra.addFlashAttribute("msg","请先登录");
       return "redirect:/sysUser/tologin";
    }

}

1.4 resources\templates目录下的两个页面文件

1.4.1 测试页面 index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>这是主页!!!!</h1>
    <h3 th:if="${session.result!=null}" th:text="'访问结果:'+${session.result}"></h3>
    <a href="/product/find">查询商品</a>
    <a href="/product/insert">添加商品</a>
    <a href="/product/update">修改商品</a>
    <a href="/product/delete">删除商品</a>
</body>
</html>
1.4.2 没有用户权限时跳转的页面 login.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/sysUser/login" method="post">
        用户名:<input type="text" name="username"><br>
        密码:<input type="password" name="password"><br>
        <button type="submit">登录</button>
        <input type="hidden" name="">
    </form>
</body>
</html>

1.5 在controller包下创建WelcomeController类,用于配置默认页面(localhost:8080时显示的页面)

package com.zlz.controller;

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

import javax.servlet.http.HttpServletRequest;

@Controller
public class WelcomeController {
    //默认访问localhost:8080进入的页面,一个斜杠代表进入你想要其进入的初始页面(默认页面的配置)
    @RequestMapping("/")
    public String welcome(){
        System.out.println("进入了没有");
        return "index";
    }
}

1.6 测试

1.6.1 查询页面
a 点击查询链接前

在这里插入图片描述

b 点击查询链接后

在这里插入图片描述

1.6.2 添加页面
a 点击添加链接前

在这里插入图片描述

b 点击添加链接后

在这里插入图片描述

1.6.3 修改页面
a 点击修改链接前

在这里插入图片描述

b 点击修改链接后

在这里插入图片描述

1.6.4 删除页面
a 点击删除链接前

在这里插入图片描述

b 点击删除链接后

在这里插入图片描述

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

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

相关文章

回顾一次后台从war包启动到jar包启动的改造

一、背景描述 1.项目情况 有个项目后台一开始是war包部署到tomcat中部署的 配置文件放在项目中 考虑到这种部署方式相对spring boot项目内置tomcat部署不太便捷&#xff0c;配置也没有独立出来&#xff0c;考虑将原来的spring mvc项目稍微改造为spring boot项目。 2.要求 1&am…

Linux设备树的概念

一.设备树概念以及作用1.设备树概念设备树(Device Tree)&#xff0c;将这个词分开就是“设备”和“树”&#xff0c;描述设备树的文件叫做 DTS(DeviceTree Source)&#xff0c;这个 DTS 文件采用树形结构描述板级设备&#xff0c;也就是开发板上的设备信息&#xff0c;比如CPU …

flowable的Task使用

ReceiveTask UserTask ServiceTask ScriptTask ReceiveTask 执行到这个ReceiveTask会停下来&#xff0c;需要人工触发一下&#xff0c;才会继续执行 ClassPathResource classPathResource new ClassPathResource("processes/ReceiveTaskDemo.bpmn20.xml");String f…

C++——模板与STL标准模板库

目录 一、模板 1.1类型模板 1.2非类型模板 二、STL 2.1链表实现 2.2迭代器 2.3STL容器 2.4STL算法 三、模板特化的匹配规则 (1) 类模板的匹配规则 (2) 函数模板的匹配规则 一、模板 1.1类型模板 #include <stdio.h> #include <iostream>using namespac…

深度学习 GAN生成对抗网络-手写数字生成及改良

如果你有一定神经网络的知识基础&#xff0c;想学习GAN生成对抗网络&#xff0c;可以按顺序参考系列文章&#xff1a; 深度学习 自动编码器与生成模型 深度学习 GAN生成对抗网络-1010格式数据生成简单案例 深度学习 GAN生成对抗网络-手写数字生成 一、前言 在前面一篇文章&am…

877. 石子游戏

877. 石子游戏题目算法设计&#xff1a;奇偶算法设计&#xff1a;动态规划题目 算法设计&#xff1a;奇偶 最简单的情况&#xff0c;只有2堆石子&#xff08;石子奇数&#xff09;&#xff0c;先稳赢。 但是四堆情况不同了&#xff0c;如 [3 7 2 3]。 不能直接选最大的&…

2023年五大趋势预测 | 大数据分析、人工智能和云产业展望

随着我们迈入2023年&#xff0c;大数据分析、人工智能和云产业将迎来蓬勃的创新和发展阶段 以下是我们预测的&#xff0c;将对行业格局产生重大影响的五大趋势&#xff1a; 世界在剧变&#xff0c;我们需要尽快寻找行业中的方向&#xff0c;迅速重回轨道 2023年&#xff0c;全…

TryHackMe-NahamStore(常见web漏洞 大杂烩)

NahamStore 漏洞赏金web安全 NahamStore的创建是为了测试您在NahamSec的“漏洞赏金狩猎和Web应用程序黑客入门”Udemy课程中学到的知识。 部署计算机&#xff0c;获得 IP 地址后&#xff0c;进入下一步&#xff01; 写在前面 可能我的顺序&#xff0c;跟别人以及题目都不太一…

spring boot集成activemq(windows)

目录 1.环境配置 2.说明 3.服务启动 4.示例 导入依赖 配置文件 service层 配置类 监听器 5.总结 1.环境配置 下载地址&#xff1a;https://activemq.apache.org/components/classic/download/安装&#xff1a;解压缩即可注意每个版本对应的java版本不一样&#xff0c…

分享96个PHP源码,总有一款适合您

PHP源码 分享96个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 96个PHP源码下载链接&#xff1a;https://pan.baidu.com/s/1B-tNZlbfjT_D3n_Y6ZwfDw?pwduq19 提取码&#xff…

共享自助自习室棋p室茶室办公室电竞篮球馆小程序开发

共享自助自习室棋p室茶室办公室电竞篮球馆小程序开发 多场景应用的共享空间预约系统如:棋牌室;共享办公室&#xff0c;电竞篮球馆&#xff0c;自助民宿等。目前该应用已对接门锁和电控。 前端功能// 多场景应用、预约时间自定义、附近门店一目了然、支持门禁支持电控、首页门…

Windows系统安装轻量级高性能Web服务开发框架OAT++

一、软件简介 oat 是一个轻量级高性能 Web 服务开发框架&#xff0c;采用纯 C 编写而成。官网&#xff1a;https://oatpp.io/ 这个坑爹的网址在国内经常打不开&#xff0c;要多刷新几次。Github: https://github.com/oatpp/oatpp 当前版本&#xff1a; 1.3.0 其主要特性…

用PYTHON自动登录SAP GUI

我们都知道&#xff0c;SAP原生的“脚本录制和回放”功能是在用户进入到某一个SAP”用户指定系统“后才可以启用&#xff1a; 也就是说&#xff0c;从这里开始&#xff0c;您可以通过脚本录制&#xff0c;生成用户名、密码的输入和SAP登录过程的完整代码&#xff1b; 那么我们…

第三层:C++对象模型和this指针

文章目录前情回顾C对象模型和this指针类成员变量和类成员函数的储存this指针this指针概念this指针用途用途1解释用途2解释空指针调用成员函数const修饰的成员变量常函数内可以被修改的值突破&#xff01;步入第四层本章知识点&#xff08;图片形式&#xff09;&#x1f389;wel…

Matlab中算法结合Simulink求解直流微电网中功率

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

初识 jQuery(JavaScript 框架)

初识 jQuery&#xff08;JavaScript 框架&#xff09;参考描述jQuery使用 jQuery 的开发优势&#xff08;部分&#xff09;获取jQuery 语法基础语法入口函数$()jQuery 与 $参数DOM 与 jQuery模板获取DOM 对象jQuery 对象转换DOM 对象转换为 jQuery 对象$()jQuery 对象转换为 DO…

Linux系统管理中Nginx和python的安装以及python虚拟环境软件的安装与使用(四)

1、Nginx的安装和配置&#xff1a; 说明&#xff1a;Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器&#xff1b;同时也是一个IMAP、POP3、SMTP代理服务器&#xff1b;Nginx可以作为一个HTTP服务器进行网站的发布处理&#xff0c;另外Nginx可以作为反向代理进…

C++:list结构算法

List 1.元素在逻辑上具有线性次序&#xff0c;物理地址不做限制。 2.哨兵节点&#xff0c;header和trailer&#xff0c;封装后外部不可见。 3.重载操作符[]&#xff0c;实现下标和位置转换。 4.有序查找无序查找 5.前插入算法&#xff0c;首先创建新节点 然后使new成为this节点…

设计模式之代理模式(静态动态)代理

前言&#xff1a;二十三种设计模式中的一种&#xff0c;属于结构型模式。它的作用就是通过提供一个代理类&#xff0c;让我们在调用目标方法的时候&#xff0c;不再是直接对目标方法进行调用&#xff0c;而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥…

PHP设计模式

目录 一、使用设计模式目的 二、设计模式的七大原则 三、创建型模式&#xff08;构建型模式&#xff09; 1、单例模式 代码实例 2、工厂模式 2.1、工厂模式——简单工厂模式 简单工厂模式的代码实例 2.2、工厂模式——工厂方法模式 工厂方法模式的代码实例 2.3、工厂…