笔记迁移(一):SpringBoot学习

P34

SpringSecurity

导入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

简介

Spring Security是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型,他可以实现强大的Web安全控制,对于安全控制,我们仅需要引入spring-boot-starter-security模块,进行少量的配置,即可实现强大的安全管理!
记住几个类:
●WebSecurityConfigurerAdapter: 自定义Security策略
●AuthenticationManagerBuilder: 自定义认证策略
●@EnableWebSecurity: 开启WebSecurity模式
Spring Security的两个主要目标是“认证”和“授权”(访问控制)。
“认证”(Authentication)
"授权”(Authorization)
这个概念是通用的,而不是只在Spring Security中存在。

编写config配置文件

  1. 编写config类继承 WebSecurityConfigurerAdapter
  2. 加上开启Security注解 @EnableWebSecurity
  3. 重写configure(HttpSecurity http)

P38

Shiro

1.定义:
  • Apache Shiro 是一个Java的安全(权限)框架。

  • Shrio 可以非常容易的开发出足够好的应用,不仅可以用在JavaSE环境,也可以用在JavaEE环境。

  • Shiro可以完成认证、授权、加密、会话管理,WEB集成,缓存等。

  • 下载地址:

2.功能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B4lCKPXS-1599313303253)(C:\Users\zsfhw\AppData\Roaming\Typora\typora-user-images\image-20200629114425260.png)]

Authentication:身份认证、登录,验证用户是不是拥有相应的身份;

Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限,即判断用户能否进行什么操作,如:验证某个用户是否拥有某个角色,或者细粒度的验证某个用户对某个资源是否具有某个权限!

Session Manager: 会话管理,即用户登录后就是第一 -次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通的JavaSE环境,也可以是Web环境;

Cryptography: 加密, 保护数据的安全性,如密码加密存储到数据库中,而不是明文存储;

Web Support: Web支持,可以非常容易的集成到Web环境;

Caching: 缓存,比如用户登录后,其用户信息,拥有的角色、权限不必每次去查,这样可以提高效率

Concurrency: Shiro支持多线程应用的并发验证,即,如在一个线程中开启另一 个线程,能把权限自动的传播过去

Testing:提供测试支持;

RunAs:允许-个用户假装为另-一个用户(如果他们允许)的身份进行访问;

Remember Me:记住我,这个是非常常见的功能,即一 -次登录后,下次再来的话不用登录了

3.Shiro架构

外部:

在这里插入图片描述

内部:
在这里插入图片描述

subject:

应用代码直接交互的对象是Subject,也就是说Shiro的对外API核心就是Subject, Subject代表了当
前的用户,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等,与Subject的所有交互都会委托给SecurityManager; Subject其实是一个门面,SecurityManageer 才是实际的执行者;

SecurityManager:

安全管理器,即所有与安全有关的操作都会与SercurityManager交互,并且它管理着所有的Subject,可以看出它是Shiro的核心,它负责与Shiro的其他组件进行交互,它相当于SpringMVC的
DispatcherServlet的角色;

Realm:

Shiro从Realm获取安全数据 (如用户,角色,权限),就是说SecurityManager 要验证用户身份,
那么它需要从Realm获取相应的用户进行比较,来确定用户的身份是否合法;也需要从Realm得到用户相应的角色、权限,进行验证用户的操作是否能够进行,可以把Realm看成DataSource;

4.配置

1.导入依赖

<!--shiro整合springboot-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring-boot-web-starter</artifactId>
            <version>1.5.3</version>
        </dependency>

2.编写配置文件

编写配置文件分3步:

​ 1.创建自定义Realm对象

@Bean
    public UserRealm getUserRealm(){
        return new UserRealm();
    }

自定义Realm只需继承AuthorizingRealm接口并重写其中的授权和认证两个方法

public class UserRealm extends AuthorizingRealm {
    @Autowired
    UserService userService;
    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        User user = (User) principalCollection.getPrimaryPrincipal();
        info.addStringPermission(user.getPerms());
        return info;
    }

    //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {

            UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;

            User user = userService.queryUserByUsername(token.getUsername());
            if(user == null){
                return null;                //这里自动抛出UnknownAccountException异常,即认为用户名不正确
            }

        //密码认证由shiro去做
        return new SimpleAuthenticationInfo(user,user.getPassword(),"");
    }
}

控制器类配合实现认真代码

    @RequestMapping("login")
    public String login(String username,String password,HttpSession session,Model model){
        //获取当前用户
        Subject currentSubject = SecurityUtils.getSubject();
        //封装用户的登陆数据
        UsernamePasswordToken token = new UsernamePasswordToken(username,password);
        try {
            currentSubject.login(token);
            User loginUser = (User) currentSubject.getPrincipal();
            session.setAttribute("loginUser",loginUser);
            return "user/success";
        } catch (UnknownAccountException e) {   //用户名不存在
            model.addAttribute("login_msg","用户不存在!");
            return "login";
        } catch (IncorrectCredentialsException e){
            model.addAttribute("login_msg","密码错误");
            return "login";
        }
    }

​ 2.制作一个提供DefaultWebSecurityManager类型对象的方法,关联Realm

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3WSIaHDZ-1599313303289)(C:\Users\zsfhw\AppData\Roaming\Typora\typora-user-images\image-20200629223310222.png)]

​ 3.制作返回ShiroFilterFactoryBean方法,关联DefaultWebSecurityManager

在这里插入图片描述

如图,在ShiroFilterFactoryBean实例里配置过滤器,等

3个方法都交给spring容器;


5.整合Thymeleaf

1.导入依赖

        <!-- thymeleaf整合shiro依赖 -->
        <dependency>
            <groupId>com.github.theborakompanioni</groupId>
            <artifactId>thymeleaf-extras-shiro</artifactId>
            <version>2.0.0</version>
        </dependency>

2.网页引入命名空间

<html lang="en" xmlns:th="http://www.thymeleaf.org"
xmlns:shiro="http://www.thymeleaf.org/thymeleaf-extras-shiro">

3.利用特定的thymeleaf标签

<body>
<h1>这里是首页</h1>
<p th:text="${msg}"></p>
<p th:if="${session.loginUser == null}"><a th:href="@{/toLogin}">登录</a></p>
<p shiro:hasPermission="user:add"> <a th:href="@{/user/add}">ADD</a></p><br>
<p shiro:hasPermission="user:update"> <a th:href="@{/user/update}">update</a></p>
<p> <a th:href="@{/user/allUser}">全部</a></p>
</body>

P47

Swagger

1.定义
  • 号称世界上最流行的API框架

  • 直接运行,可以在线测试API接口

  • 支持多种语言

  • 拥有文档自动生成工具,API文档与API定义同步更新

2.搭建
1.引入依赖
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
2.编写配置类
@Configuration
@EnableSwagger2
public class SwaggerConfig {
}
3.访问页面

http://127.0.0.1:8080/swagger-ui.html

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L9yxZl6O-1599313303302)(C:\Users\zsfhw\AppData\Roaming\Typora\typora-user-images\image-20200712234117466.png)]

3.配置Swagger

Swagger的bean实例Docket;

    /**配置了swagger2的bean实例,不配置使用Docket类中的默认值
     * @return 返回一个配置后的Docket
     */
    @Bean
    public Docket docket(){
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
                //.enable(false)    
            	//是否开启swagger,false则不开启,便无法在浏览器中访问

                .select()
                //RequestHandlerSelectors,配置要扫描接口的方式
                //basePackage:指定要扫描的包
                //any():扫描全部
                //none():不扫描
                //withClassAnnotation:扫描类上的注解,参数是-个注解的反射对象
                //withMethodAnnotation:扫描方法上的注解
                .apis(RequestHandlerSelectors.basePackage("xyz.link666.controller"))
                //过滤路径设置.paths(),.ant只扫描给定的请求路径,如下只扫描/new开头的请求路径
                //.paths(PathSelectors.ant("/new/**"))
                .build();
    }

    private ApiInfo apiInfo(){
        Contact contact = new Contact("link", "http://bilibili.com", "cxwl.h@qq.com");
        return new ApiInfo("我的API",
                "A今天刚做的",
                "1.0",
                "http://baidu.com",
                contact,
                "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList<VendorExtension>());
        		//这段new的代码是在ApiInfo类里的,直接拿过来用
    }

配置多个分组:

.groupName("dev")

​ 若新建多个分组,则需要新建多个

@Bean  
  public Docket docket1(){}
@Bean  
  public Docket docket2(){}
@Bean  
  public Docket docket3(){}
4.常用注解

@ApiOperation用在方法上的文档注释

@ApiParam参数注释

@ApiModelProperty实体类属性注释 (当接口方法返回一个实体类时)

常用注解:
- @Api()用于类;
表示标识这个类是swagger的资源

tags–表示说明
value–也是说明,可以使用tags替代

- @ApiOperation()用于方法;
表示一个http请求的操作

value用于方法描述
notes用于提示内容
tags可以重新分组(视情况而用)

- @ApiParam()用于方法,参数,字段说明;
表示对参数的添加元数据(说明或是否必填等)

name–参数名
value–参数说明
required–是否必填

- @ApiModel()用于类
表示对类进行说明,用于参数用实体类接收

value–表示对象名
description–描述
都可省略

- @ApiModelProperty()用于方法,字段
表示对model属性的说明或者数据操作更改

value–字段说明
name–重写属性名字
dataType–重写属性类型
required–是否必填
example–举例说明
hidden–隐藏

- @ApiIgnore()用于类,方法,方法参数
表示这个方法或者类被忽略

- @ApiImplicitParam() 用于方法
表示单独的请求参数

- @ApiImplicitParams() 用于方法,包含多个 @ApiImplicitParam

name–参数ming
value–参数说明
dataType–数据类型
paramType–参数类型
example–举例说明

  @ApiOperation("查询测试")
  @GetMapping("select")
  //@ApiImplicitParam(name="name",value="用户名",dataType="String", paramType = "query")
  @ApiImplicitParams({
  @ApiImplicitParam(name="name",value="用户名",dataType="string", paramType = "query",example="xingguo"),
  @ApiImplicitParam(name="id",value="用户id",dataType="long", paramType = "query")})
  public void select(){

  }
5.总结:

1.我们可以通过Swagger给一些比较难理解的属性或者接口, 增加注释信息
2.接口文档实时更新 辐射官方
3.可以在线测试(类似postman)

4.在正式发布的时候,关闭Swagger! ! !出于安全考虑。而且节省运行的内存;

P51

异步任务

在异步方法上使用==@Async==注解 (一个异步方法的返回值最好应当为void)

@Async
public void async() {
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("处理完毕");
}

在启动器上使用 @EnableAsync注解

即可实现异步;

P52

邮件任务

1.引入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2.demo
    @Autowired
    JavaMailSender mailSender;

    //发送人
    @Value("${spring.mail.username}")
    private String sendFrom;

    @Test
    void contextLoads() throws MessagingException {
        //一个简单的邮件
        //SimpleMailMessage message = new SimpleMailMessage();
        //message.setFrom(sendFrom);
        //message.setTo("xxxx@163.com");
        //message.setSubject("一封信");
        //message.setText("nothing!");
        //mailSender.send(message);

        //一个复杂的邮件    1.先拿JavaMailSender中的createMimeMessage()生成一个MimeMessage实体类
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        //进行组装         2.new一个MimeMessageHelper对象进行组装,其构造器有多种形式,这里选择可以上传文件
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);

        //发送信息
        helper.setFrom(sendFrom);
        helper.setTo("xxxx@163.com");
        //正文
        helper.setSubject("给你发点好康的");
        helper.setText("如图:");
        //附件
        helper.addAttachment("第一个.jpg", new File("G:\\桌面\\资源中心\\gakki.jpg"));
        helper.addAttachment("第二个.jpg", new File("G:\\桌面\\资源中心\\图包\\蕾姆\\1F13H4R-40.jpg"));

        mailSender.send(mimeMessage);
    }

P53

定时任务

首先在启动器类上开启注解:

@EnableScheduling  // 开启定时功能注解

然后添加任务

    //添加定时任务
    @Scheduled(cron = "0/5 * * * * ?")
    //或直接指定时间间隔,例如:5秒
    //@Scheduled(fixedRate=5000)
    private void configureTasks() {
        System.err.println("执行静态定时任务时间: " + LocalDateTime.now());
    }

Cron表达式

Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:

(1) Seconds Minutes Hours DayofMonth Month DayofWeek Year

(2)Seconds Minutes Hours DayofMonth Month DayofWeek

一、结构

corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份

二、各字段的含义

字段允许值允许的特殊字符
秒(Seconds)0~59的整数, - * / 四个字符
分(Minutes0~59的整数, - * / 四个字符
小时(Hours0~23的整数, - * / 四个字符
日期(DayofMonth1~31的整数(但是你需要考虑你月的天数),- * ? / L W C 八个字符
月份(Month1~12的整数或者 JAN-DEC, - * / 四个字符
星期(DayofWeek1~7的整数或者 SUN-SAT (1=SUN), - * ? / L C # 八个字符
年(可选,留空)(Year1970~2099, - * / 四个字符

注意事项:

每一个域都使用数字,但还可以出现如下特殊字符,它们的含义是:

(1):表示匹配该域的任意值。假如在Minutes域使用, 即表示每分钟都会触发事件。

(2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发,实际上并不是这样。

(3)-:表示范围。例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次

(4)/:表示起始时间开始触发,然后每隔固定时间触发一次。例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.

(5),:表示列出枚举值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。

(6)L:表示最后,只能出现在DayofWeek和DayofMonth域。如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。

(7)W:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 。

(8)LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。

(9)#:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。

三、常用表达式例子

(1)0 0 2 1 * ? * 表示在每月的1日的凌晨2点调整任务

(2)0 15 10 ? * MON-FRI 表示周一到周五每天上午10:15执行作业

(3)0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的最后一个星期五上午10:15执行作

(4)0 0 10,14,16 * * ? 每天上午10点,下午2点,4点

(5)0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时

(6)0 0 12 ? * WED 表示每个星期三中午12点

(7)0 0 12 * * ? 每天中午12点触发

(8)0 15 10 ? * * 每天上午10:15触发

(9)0 15 10 * * ? 每天上午10:15触发

(10)0 15 10 * * ? * 每天上午10:15触发

(11)0 15 10 * * ? 2005 2005年的每天上午10:15触发

(12)0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发

(13)0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发

(14)0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发

(15)0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发

(16)0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发

(17)0 15 10 ? * MON-FRI 周一至周五的上午10:15触发

(18)0 15 10 15 * ? 每月15日上午10:15触发

(19)0 15 10 L * ? 每月最后一日的上午10:15触发

(20)0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发

(21)0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发

(22)0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发

注:

(1)有些子表达式能包含一些范围或列表

例如:子表达式(天(星期))可以为 “MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT”

“*”字符代表所有可能的值

因此,“ * ”在子表达式(月)里表示每个月的含义,“*”在子表达式(天(星期))表示星期的每一天

“/”字符用来指定数值的增量
  例如:在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟
在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样

“?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值
  当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”

“L” 字符仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写
  但是它在两个子表达式里的含义是不同的。
  在天(月)子表达式中,“L”表示一个月的最后一天
  在天(星期)自表达式中,“L”表示一个星期的最后一天,也就是SAT

如果在“L”前有具体的内容,它就具有其他的含义了

例如:“6L”表示这个月的倒数第6天,“FRIL”表示这个月的最一个星期五
  注意:在使用“L”参数时,不要指定列表或范围,因为这会导致问题

P54

Redis

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以和你分享一些关于Spring Boot学习笔记。 1. Spring Boot是什么? Spring Boot是一个基于Spring框架的快速开发框架,它能够帮助开发者快速搭建Spring项目,简化了Spring应用开发的繁琐过程,提高了开发效率。 2. Spring Boot的优点有哪些? Spring Boot的优点有很多,其中包括: - 简化了Spring应用的开发,提高了开发效率; - 集成了很多常用的第三方库,减少了依赖管理的工作; - 自动化配置,减少了配置文件的编写工作; - 内嵌了Tomcat等Web容器,使得应用的部署更加便捷; - 提供了Actuator等模块,使得应用的监控和管理更加便捷。 3. Spring Boot的核心注解有哪些? Spring Boot的核心注解包括: - @SpringBootApplication:标注在启动类上,代表这是一个Spring Boot应用; - @Controller:标注在控制器类上,处理HTTP请求; - @Service:标注在服务类上,用于处理业务逻辑; - @Repository:标注在数据访问类上,用于数据库访问; - @Configuration:标注在配置类上,用于配置Spring应用上下文。 4. Spring Boot的配置文件有哪些? Spring Boot的配置文件包括: - application.properties:基于Key-Value的属性文件; - application.yml:基于YAML语法的配置文件。 5. 如何使用Spring Boot集成数据库? 使用Spring Boot集成数据库需要完成以下几个步骤: - 在pom.xml中添加相关数据库依赖; - 配置数据源和JPA/Hibernate等相关配置; - 编写实体类和DAO层代码。 以上就是一些关于Spring Boot学习笔记,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值