Spring Boot学习笔记(1)

文章目录

    • Spring Boot学习笔记(1)
      • Spring Boot 整合 JSP
      • Spring Boot HTML
      • Thymeleaf 常用语法
      • Spring Boot 数据校验
      • Spring Boot 整合 JDBC
      • Spring Boot 整合 MyBatis
      • Spring Boot整合Spring Data JPA
      • SpringBoot整合mongodb
      • Spring Boot 整合 Redis
        • Redis
        • 启动 Redis 服务
        • Spring Boot 整合 Redis
        • Redis 5 种数据类型
      • Spring Boot 整合 Spring Security
        • 权限管理
      • Spring Boot 整合Shiro
        • Shiro 核心组件

Spring Boot学习笔记(1)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Spring Boot 是一个快速开发框架,可以迅速搭建出一套基于 Spring 框架体系的应用,是 Spring Cloud 的基础。

Spring Boot 开启了各种自动装配,从而简化代码的开发,不需要编写各种配置文件,只需要引入相关依赖就可以迅速搭建一个应用。

  • 特点

1、不需要 web.xml

2、不需要 springmvc.xml

3、不需要 tomcat,Spring Boot 内嵌了 tomcat

4、不需要配置 JSON 解析,支持 REST 架构

5、个性化配置非常简单

  • 如何使用

1、创建 Maven 工程,导入相关依赖。


<parent><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-parentartifactId><version>2.0.7.RELEASEversion>
parent><dependencies><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId>dependency><dependency><groupId>org.projectlombokgroupId><artifactId>lombokartifactId><version>1.18.6version><scope>providedscope>dependency>
dependencies>

2、创建 Student 实体类

package com.southwind.entity;import lombok.Data;@Data
public class Student {private long id;private String name;private int age;
}

3、StudentRepository

package com.southwind.repository;import com.southwind.entity.Student;import java.util.Collection;public interface StudentRepository {public Collection<Student> findAll();public Student findById(long id);public void saveOrUpdate(Student student);public void deleteById(long id);
}

4、StudentRepositoryImpl

package com.southwind.repository.impl;import com.southwind.entity.Student;
import com.southwind.repository.StudentRepository;
import org.springframework.stereotype.Repository;import java.util.Collection;
import java.util.HashMap;
import java.util.Map;@Repository
public class StudentRepositoryImpl implements StudentRepository {private static Map<Long,Student> studentMap;static{studentMap = new HashMap<>();studentMap.put(1L,new Student(1L,"张三",22));studentMap.put(2L,new Student(2L,"李四",23));studentMap.put(3L,new Student(3L,"王五",24));}@Overridepublic Collection<Student> findAll() {return studentMap.values();}@Overridepublic Student findById(long id) {return studentMap.get(id);}@Overridepublic void saveOrUpdate(Student student) {studentMap.put(student.getId(),student);}@Overridepublic void deleteById(long id) {studentMap.remove(id);}
}

5、StudentHandler

package com.southwind.controller;import com.southwind.entity.Student;
import com.southwind.repository.StudentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.Collection;@RestController
@RequestMapping("/student")
public class StudentHandler {@Autowiredprivate StudentRepository studentRepository;@GetMapping("/findAll")public Collection<Student> findAll(){return studentRepository.findAll();}@GetMapping("/findById/{id}")public Student findById(@PathVariable("id") long id){return studentRepository.findById(id);}@PostMapping("/save")public void save(@RequestBody Student student){studentRepository.saveOrUpdate(student);}@PutMapping("/update")public void update(@RequestBody Student student){studentRepository.saveOrUpdate(student);}@DeleteMapping("/deleteById/{id}")public void deleteById(@PathVariable("id") long id){studentRepository.deleteById(id);}
}

6、application.yml

server:port: 9090

7、启动类

package com.southwind;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class,args);}
}

@SpringBootApplication 表示当前类是 Spring Boot 的入口,Application 类的存放位置必须是其他相关业务类的存放位置的父级。

Spring Boot 整合 JSP

  • pom.xml
<parent><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-parentartifactId><version>2.0.7.RELEASEversion>
parent><dependencies><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-tomcatartifactId>dependency><dependency><groupId>org.apache.tomcat.embedgroupId><artifactId>tomcat-embed-jasperartifactId>dependency><dependency><groupId>jstlgroupId><artifactId>jstlartifactId><version>1.2version>dependency><dependency><groupId>org.projectlombokgroupId><artifactId>lombokartifactId><version>1.18.6version><scope>providedscope>dependency>
dependencies>
  • 创建配置文件 application.yml
server:port: 8181
spring:mvc:view:prefix: /suffix: .jsp
  • 创建 Handler
package com.southwind.controller;import com.southwind.entity.Student;
import com.southwind.repository.StudentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
@RequestMapping("/hello")
public class HelloHandler {@Autowiredprivate StudentRepository studentRepository;@GetMapping("/index")public ModelAndView index(){ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("index");modelAndView.addObject("list",studentRepository.findAll());return modelAndView;}@GetMapping("/deleteById/{id}")public String deleteById(@PathVariable("id") long id){studentRepository.deleteById(id);return "redirect:/hello/index";}@PostMapping("/save")public String save(Student student){studentRepository.saveOrUpdate(student);return "redirect:/hello/index";}@PostMapping("/update")public String update(Student student){studentRepository.saveOrUpdate(student);return "redirect:/hello/index";}@GetMapping("/findById/{id}")public ModelAndView findById(@PathVariable("id") long id){ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("update");modelAndView.addObject("student",studentRepository.findById(id));return modelAndView;}
}
  • JSP
<%--Created by IntelliJ IDEA.User: southwindDate: 2019-03-21Time: 12:02To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>Titletitle>
head>
<body><h1>学生信息h1><table><tr><th>学生编号th><th>学生姓名th><th>学生年龄th><th>操作th>tr><c:forEach items="${list}" var="student"><tr><td>${student.id}td><td>${student.name}td><td>${student.age}td><td><a href="/hello/findById/${student.id}">修改a><a href="/hello/deleteById/${student.id}">删除a>td>tr>c:forEach>table><a href="/save.jsp">添加学生a>
body>
html>
<%--Created by IntelliJ IDEA.User: southwindDate: 2019-03-21Time: 12:09To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Titletitle>
head>
<body><form action="/hello/save" method="post">ID:<input type="text" name="id"/><br/>name:<input type="text" name="name"/><br/>age:<input type="text" name="age"/><br/><input type="submit" value="提交"/>form>
body>
html>
<%--Created by IntelliJ IDEA.User: southwindDate: 2019-03-21Time: 12:09To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Titletitle>
head>
<body><form action="/hello/update" method="post">ID:<input type="text" name="id" value="${student.id}" readonly/><br/>name:<input type="text" name="name" value="${student.name}"/><br/>age:<input type="text" name="age" value="${student.age}"/><br/><input type="submit" value="提交"/>form>
body>
html>

Spring Boot HTML

Spring Boot 可以结合 Thymeleaf 模版来整合 HTML,使用原生的 HTML 作为视图。

Thymeleaf 模版是面向 Web 和独立环境的 Java 模版引擎,能够处理 HTML、XML、JavaScript、CSS 等。
在这里插入图片描述
static文件夹下资源可直接访问,templates下则需要配置映射。

<p th:text="${message}">p>
  • pom.xml

<parent><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-parentartifactId><version>2.0.7.RELEASEversion>
parent><dependencies><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId>dependency><dependency><groupId>org.projectlombokgroupId><artifactId>lombokartifactId><version>1.18.6version><scope>providedscope>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-thymeleafartifactId>dependency>
dependencies>
  • appliction.yml
server:port: 9090
spring:thymeleaf:prefix: classpath:/templates/suffix: .htmlmode: HTML5encoding: UTF-8
  • Handler
package com.southwind.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@RequestMapping("/index")
public class IndexHandler {@GetMapping("/index")public String index(){System.out.println("index...");return "index";}
}
  • HTML
DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Titletitle>
head>
<body><h1>Hello Worldh1>
body>
html>

在这里插入图片描述

如果希望客户端可以直接访问 HTML 资源,将这些资源放置在 static 路径下即可,否则必须通过 Handler 的后台映射才可以访问静态资源。

Thymeleaf 常用语法

  • 赋值、拼接
@GetMapping("/index2")
public String index2(Map<String,String> map){map.put("name","张三");return "index";
}
<p th:text="${name}">p>
<p th:text="'学生姓名是'+${name}+2">p>
<p th:text="|学生姓名是,${name}|">p>
  • 条件判断:if/unless

th:if 表示条件成立时显示内容,th:unless 表示条件不成立时显示内容

@GetMapping("/if")
public String index3(Map<String,Boolean> map){map.put("flag",true);return "index";
}
<p th:if="${flag == true}" th:text="if判断成立">p>
<p th:unless="${flag != true}" th:text="unless判断成立">p>
  • 循环
@GetMapping("/index")
public String index(Model model){System.out.println("index...");List<Student> list = new ArrayList<>();list.add(new Student(1L,"张三",22));list.add(new Student(2L,"李四",23));list.add(new Student(3L,"王五",24));model.addAttribute("list",list);return "index";
}
<table><tr><th>indexth><th>countth><th>学生IDth><th>学生姓名th><th>学生年龄th>tr><tr th:each="student,stat:${list}" th:style="'background-color:'+@{${stat.odd}?'#F2F2F2'}"><td th:text="${stat.index}">td><td th:text="${stat.count}">td><td th:text="${student.id}">td><td th:text="${student.name}">td><td th:text="${student.age}">td>tr>
table>

stat 是状态变量,属性:

  • index 集合中元素的index(从0开始)
  • count 集合中元素的count(从1开始)
  • size 集合的大小
  • current 当前迭代变量
  • even/odd 当前迭代是否为偶数/奇数(从0开始计算)
  • first 当前迭代的元素是否是第一个
  • last 当前迭代的元素是否是最后一个
  • URL

Thymeleaf 对于 URL 的处理是通过 @{...} 进行处理,结合 th:href 、th:src

<h1>Hello Worldh1>
<a th:href="@{http://www.baidu.com}">跳转a>
<a th:href="@{http://localhost:9090/index/url/{na}(na=${name})}">跳转2a>
<img th:src="${src}">
<div th:style="'background:url('+ @{${src}} +');'"><br/><br/><br/>
div>
  • 三元运算
@GetMapping("/eq")
public String eq(Model model){model.addAttribute("age",30);return "test";
}
<input th:value="${age gt 30?'中年':'青年'}"/>
  • gt great than 大于
  • ge great equal 大于等于
  • eq equal 等于
  • lt less than 小于
  • le less equal 小于等于
  • ne not equal 不等于
  • switch
@GetMapping("/switch")
public String switchTest(Model model){model.addAttribute("gender","女");return "test";
}
<div th:switch="${gender}"><p th:case="">p><p th:case="">p><p th:case="*">未知p>
div>
  • 基本对象
    • #ctx :上下文对象
    • #vars:上下文变量
    • #locale:区域对象
    • #request:HttpServletRequest 对象
    • #response:HttpServletResponse 对象
    • #session:HttpSession 对象
    • #servletContext:ServletContext 对象
@GetMapping("/object")
public String object(HttpServletRequest request){request.setAttribute("request","request对象");request.getSession().setAttribute("session","session对象");return "test";
}
<p th:text="${#request.getAttribute('request')}">p>
<p th:text="${#session.getAttribute('session')}">p>
<p th:text="${#locale.country}">p>
  • 内嵌对象

可以直接通过 # 访问。

1、dates:java.util.Date 的功能方法

2、calendars:java.util.Calendar 的功能方法

3、numbers:格式化数字

4、strings:java.lang.String 的功能方法

5、objects:Object 的功能方法

6、bools:对布尔求值的方法

7、arrays:操作数组的功能方法

8、lists:操作集合的功能方法

9、sets:操作集合的功能方法

10、maps:操作集合的功能方法

@GetMapping("/util")
public String util(Model model){model.addAttribute("name","zhangsan");model.addAttribute("users",new ArrayList<>());model.addAttribute("count",22);model.addAttribute("date",new Date());return "test";
}

<p th:text="${#dates.format(date,'yyyy-MM-dd HH:mm:sss')}">p>

<p th:text="${#dates.createToday()}">p>

<p th:text="${#dates.createNow()}">p>

<p th:text="${#strings.isEmpty(name)}">p>

<p th:text="${#lists.isEmpty(users)}">p>

<p th:text="${#strings.length(name)}">p>

<p th:text="${#strings.concat(name,name,name)}">p>

<p th:text="${#strings.randomAlphanumeric(count)}">p>

Spring Boot 数据校验

package com.southwind.entity;import lombok.Data;
import org.hibernate.validator.constraints.Length;import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;@Data
public class User {@NotNull(message = "id不能为空")private Long id;@NotEmpty(message = "姓名不能为空")@Length(min = 2,message = "姓名长度不能小于2位")private String name;@Min(value = 16,message = "年龄必须大于16岁")private int age;
}
@GetMapping("/validator")
public void validatorUser(@Valid User user,BindingResult bindingResult){System.out.println(user);if(bindingResult.hasErrors()){List<ObjectError> list = bindingResult.getAllErrors();for(ObjectError objectError:list){System.out.println(objectError.getCode()+"-"+objectError.getDefaultMessage());}}
}

Spring Boot 整合 JDBC

  • pom.xml
<dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-jdbcartifactId>
dependency><dependency><groupId>mysqlgroupId><artifactId>mysql-connector-javaartifactId><version>8.0.11version>
dependency>
  • application.yml
server:port: 9090
spring:thymeleaf:prefix: classpath:/templates/suffix: .htmlmode: HTML5encoding: UTF-8datasource:url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
  • User
package com.southwind.entity;import lombok.Data;
import org.hibernate.validator.constraints.Length;import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;@Data
public class User {@NotNull(message = "id不能为空")private Long id;@NotEmpty(message = "姓名不能为空")@Length(min = 2,message = "姓名长度不能小于2位")private String name;@Min(value = 60,message = "成绩必须大于60分")private double score;
}
  • UserRepository
package com.southwind.repository;import com.southwind.entity.User;import java.util.List;public interface UserRepository {public List<User> findAll();public User findById(long id);public void save(User user);public void update(User user);public void deleteById(long id);
}
  • UserRepositoryImpl
package com.southwind.repository.impl;import com.southwind.entity.User;
import com.southwind.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;import java.util.List;@Repository
public class UserRepositoryImpl implements UserRepository {@Autowiredprivate JdbcTemplate jdbcTemplate;@Overridepublic List<User> findAll() {return jdbcTemplate.query("select * from user",new BeanPropertyRowMapper<>(User.class));}@Overridepublic User findById(long id) {return jdbcTemplate.queryForObject("select * from user where id = ?",new Object[]{id},new BeanPropertyRowMapper<>(User.class));}@Overridepublic void save(User user) {jdbcTemplate.update("insert into user(name,score) values(?,?)",user.getName(),user.getScore());}@Overridepublic void update(User user) {jdbcTemplate.update("update user set name = ?,score = ? where id = ?",user.getName(),user.getScore(),user.getId());}@Overridepublic void deleteById(long id) {jdbcTemplate.update("delete from user where id = ?",id);}
}
  • Handler
package com.southwind.controller;import com.southwind.entity.User;
import com.southwind.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/user")
public class UserHandler {@Autowiredprivate UserRepository userRepository;@GetMapping("/findAll")public List<User> findAll(){return userRepository.findAll();}@GetMapping("/findById/{id}")public User findById(@PathVariable("id") long id){return userRepository.findById(id);}@PostMapping("/save")public void save(@RequestBody User user){userRepository.save(user);}@PutMapping("/update")public void update(@RequestBody User user){userRepository.update(user);}@DeleteMapping("/deleteById/{id}")public void deleteById(@PathVariable("id") long id){userRepository.deleteById(id);}
}

Spring Boot 整合 MyBatis

  • pom.xml
<dependency><groupId>org.mybatis.spring.bootgroupId><artifactId>mybatis-spring-boot-starterartifactId><version>1.3.1version>
dependency>
  • application.yml
server:port: 9090
spring:thymeleaf:prefix: classpath:/templates/suffix: .htmlmode: HTML5encoding: UTF-8datasource:url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
mybatis:mapper-locations: classpath:/mapping/*.xmltype-aliases-package: com.southwind.entity
  • UserRepository
package com.southwind.mapper;import com.southwind.entity.User;import java.util.List;public interface UserRepository {public List<User> findAll(int index,int limit);public User findById(long id);public void save(User user);public void update(User user);public void deleteById(long id);public int count();
}
  • UserRepository.xml
DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.southwind.mapper.UserRepository"><select id="findAll" resultType="User">select * from user limit #{param1},#{param2}select><select id="count" resultType="int">select count(id) from userselect><select id="findById" parameterType="long" resultType="User">select * from user where id = #{id}select><insert id="save" parameterType="User">insert into user(name,score) values(#{name},#{score})insert><update id="update" parameterType="User">update user set name = #{name},score = #{score} where id = #{id}update><delete id="deleteById" parameterType="long">delete from user where id = #{id}delete>
mapper>
  • User
package com.southwind.entity;import lombok.Data;
import org.hibernate.validator.constraints.Length;import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;@Data
public class User {@NotNull(message = "id不能为空")private Long id;@NotEmpty(message = "姓名不能为空")@Length(min = 2,message = "姓名长度不能小于2位")private String name;@Min(value = 60,message = "成绩必须大于60分")private double score;
}
  • Handler
package com.southwind.controller;
import com.southwind.entity.User;
import com.southwind.mapper.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;@Controller
@RequestMapping("/mapper")
public class UserMapperHandler {@Autowiredprivate UserRepository userRepository;private int limit = 10;@GetMapping("/findAll/{page}")public ModelAndView findAll(@PathVariable("page") int page){ModelAndView modelAndView = new ModelAndView();int index = (page-1)*limit;modelAndView.setViewName("show");modelAndView.addObject("list",userRepository.findAll(index,limit));modelAndView.addObject("page",page);//计算总页数int count = userRepository.count();int pages = 0;if(count%limit == 0){pages = count/limit;}else{pages = count/limit+1;}modelAndView.addObject("pages",pages);return modelAndView;}@GetMapping("/deleteById/{id}")public String deleteById(@PathVariable("id") long id){userRepository.deleteById(id);return "redirect:/mapper/findAll/1";}@GetMapping("/findById")public ModelAndView findById(@RequestParam("id") long id){ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("user",userRepository.findById(id));modelAndView.setViewName("update");return modelAndView;}@PostMapping("/update")public String update(@RequestBody User user){userRepository.update(user);return "redirect:/mapper/findAll/1";}@PostMapping("/save")public String save(@RequestBody User user){userRepository.save(user);return "redirect:/mapper/findAll/1";}@GetMapping("/redirect/{name}")public String redirect(@PathVariable("name") String name){return name;}
}
  • HTML
DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html lang="en">
<head><meta charset="UTF-8"><title>Titletitle>
head>
<body><form action="/mapper/save" method="post">用户姓名:<input type="text" name="name" /><br/>用户成绩:<input type="text" name="score" /><br/><input type="submit" value="提交"/>form>
body>
html>
DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html lang="en">
<head><meta charset="UTF-8"><title>Titletitle>
head>
<body><form action="/mapper/update" method="post">用户ID:<input type="text" name="id" th:value="${user.id}" readonly/><br/>用户姓名:<input type="text" name="name" th:value="${user.name}" /><br/>用户成绩:<input type="text" name="score" th:value="${user.score}" /><br/><input type="submit" value="提交"/>form>
body>
html>
DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html lang="en">
<head><meta charset="UTF-8"><title>Titletitle><script type="text/javascript" th:src="@{/jquery-3.3.1.min.js}">script><script type="text/javascript">$(function(){$("#first").click(function(){var page = $("#page").text();page = parseInt(page);if(page == 1){return false;}window.location.href="/mapper/findAll/1";});$("#previous").click(function(){var page = $("#page").text();page = parseInt(page);if(page == 1){return false;}page = page-1;window.location.href="/mapper/findAll/"+page;});$("#next").click(function(){var page = $("#page").text();var pages = $("#pages").text();if(page == pages){return false;}page = parseInt(page);page = page+1;window.location.href="/mapper/findAll/"+page;});$("#last").click(function(){var page = $("#page").text();var pages = $("#pages").text();if(page == pages){return false;}window.location.href="/mapper/findAll/"+pages;});});script>
head>
<body><h1>用户信息h1><table><tr><th>用户IDth><th>用户名th><th>成绩th><th>操作th>tr><tr th:each="user:${list}"><td th:text="${user.id}">td><td th:text="${user.name}">td><td th:text="${user.score}">td><td><a th:href="@{/mapper/deleteById/{id}(id=${user.id})}">删除a><a th:href="@{/mapper/findById(id=${user.id})}">修改a>td>tr>table><a id="first" href="javascript:void(0)">首页a><a id="previous" href="javascript:void(0)">上一页a><span id="page" th:text="${page}">span>/<span id="pages" th:text="${pages}">span><a id="next" href="javascript:void(0)">下一页a><a id="last" href="javascript:void(0)">尾页a><br/><a href="/mapper/redirect/save">添加用户a>
body>
html>

Spring Boot整合Spring Data JPA

JPA Hibernate框架就是一个JPA的实现。
Spring Data JPA 不是对JPA规范的具体实现,本身是一个抽象层。

1、pom.xml - 导入相关的依赖

 	<dependencies><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-data-jpaartifactId>dependency><dependency><groupId>mysqlgroupId><artifactId>mysql-connector-javaartifactId><version>8.0.15version>dependency><dependency><groupId>org.projectlombokgroupId><artifactId>lombokartifactId>dependency>dependencies>

2、创建Student实体类:

package com.southwind.entity;import lombok.Data;import javax.persistence.*;
import java.util.Date;@Data
@Entity
public class Student {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Columnprivate String name;@Columnprivate Double score;@Columnprivate Date birthday;
}

3、创建StudentRepository接口:

package com.southwind.repository;import com.southwind.entity.Student;
import org.springframework.data.jpa.repository.JpaRepository;import java.util.List;public interface StudentRepository extends JpaRepository<Student,Long> {public Student getById(Long id);
}

4、创建StudentHandler,注入StudentRepository:

package com.southwind.controller;import com.southwind.entity.Student;
import com.southwind.repository.StudentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
public class StudentHandler {@Autowiredprivate StudentRepository studentRepository;@GetMapping("/findAll")public List<Student> findAll(){return studentRepository.findAll();}@GetMapping("/findById/{id}")public Student get(@PathVariable("id") Long id){return studentRepository.findById(id).get();}@PostMapping("/save")public Student save(@RequestBody Student student){return studentRepository.save(student);}@PutMapping("/update")public Student update(@RequestBody Student student){return studentRepository.save(student);}@DeleteMapping("/deleteById/{id}")public void deleteById(@PathVariable("id") Long id){studentRepository.deleteById(id);}}

5、application.yml

spring:datasource:url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverjpa:show-sql: true            #输出SQLproperties:hibernate:format_sql: true      #格式化SQL

6、创建启动类:

package com.southwind;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class,args);}
}

SpringBoot整合mongodb

BSON类似于JSON的一种数据格式

1、创建Maven工程,pom.xml

	<dependencies><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-data-mongodbartifactId>dependency><dependency><groupId>org.projectlombokgroupId><artifactId>lombokartifactId>dependency>dependencies>

2、创建实体类

package com.southwind.entity;import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;@Document(collection = "my_student")
@Data
public class Student {@Idprivate String id;@Field(value = "student_age")private int age;@Field(value = "student_name")private String name;
}

3、创建StudentRepository接口,于Spring Data JPA一样,只需要定义不需要实现。

package com.southwind.repository;import com.southwind.entity.Student;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;@Repository
public interface StudentRepository extends MongoRepository<Student,String>{public Student getById(String id);
}

4、创建StudentHandler

package com.southwind.controller;import com.southwind.entity.Student;
import com.southwind.repository.StudentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
public class StudentHandler {@Autowiredprivate StudentRepository studentReposity;@GetMapping("/findAll")public List<Student> findAll(){return studentReposity.findAll();}@GetMapping("/findById/{id}")public Student findById(@PathVariable("id") String id){return studentReposity.findById(id).get();}@PostMapping("/save")public Student save(@RequestBody Student student){return studentReposity.save(student);}@PutMapping("/update")public Student update(@RequestBody Student student){return studentReposity.save(student);}@DeleteMapping("/deleteById/{id}")public void deleteById(@PathVariable("id") String id){studentReposity.deleteById(id);}
}

5、application.yml

spring:data:mongodb:database: my_testhost: 127.0.0.1port: 12345

6、创建启动类

package com.southwind;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class,args);}
}

Spring Boot 整合 Redis

Redis

基于内存进⾏存储,⽀持 key-value 的存储形式,底层是⽤ C 语⾔编写的。
基于 key-value 形式的数据字典,结构⾮常简单,没有数据表的概念,直接⽤键值对的形式完成数据的
管理,Redis ⽀持 5 种数据类型:

  • 字符串
  • 列表
  • 集合
  • 有序集合
  • 哈希

安装 Redis
1、下载 Redis https://redis.io/download
在这里插入图片描述
2、解压,并在本地硬盘任意位置创建⽂件夹,在其中创建 3 个⼦⽂件夹,把相应目录解压的文件放在里面去

  • bin:放置启动 Redis 的可执⾏⽂件
  • db:放置数据⽂件
  • etc:放置配置⽂件,设置 Redis 服务的端⼝、⽇志⽂件位置、数据⽂件位置…

启动 Redis 服务

1、进⼊ redis ⽬录,启动 redis-server。

sudo ./bin/redis-server ./etc/redis.conf

2、进⼊ redis ⽬录,启动 redis-cli,启动 Redis 的客户端管理窗⼝,在此窗⼝中即可操作 Redis 数据
库。

./bin/redis-cli

3、对数据进⾏操作。

set key value
get key

4、关闭 Redis 服务。

shutdown

5、退出客户端,control+c。

Spring Boot 整合 Redis

Spring Data Redis 操作 Redis。
1、创建 Maven ⼯程。

<parent><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-parentartifactId><version>2.1.5.RELEASEversion>
parent>
<dependencies><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-data-redisartifactId>dependency><dependency><groupId>org.apache.commonsgroupId><artifactId>commons-pool2artifactId>dependency><dependency><groupId>org.projectlombokgroupId><artifactId>lombokartifactId>dependency>
dependencies>

2、创建实体类,实现序列化接⼝,否则⽆法存⼊ Redis 数据库。

package com.southwind.entity;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class Student implements Serializable {  //实现Serializable接口private Integer id;private String name;private Double score;private Date birthday;
}

3、创建控制器。

package com.southwind.controller;
import com.southwind.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
@RestController
public class StudentHandler {@Autowiredprivate RedisTemplate redisTemplate;@PostMapping("/set")public void set(@RequestBody Student student){redisTemplate.opsForValue().set("student",student);}@GetMapping("/get/{key}")public Student get(@PathVariable("key") String key){return (Student) redisTemplate.opsForValue().get(key);}@DeleteMapping("/delete/{key}")public boolean delete(@PathVariable("key") String key){redisTemplate.delete(key);return redisTemplate.hasKey(key);}
}

4、创建配置⽂件 application.yml

spring:redis:database: 0host: localhostport: 6379

5、创建启动类

package com.southwind;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class,args);}
}

Redis 5 种数据类型

字符串

@GetMapping("/string")
public String stringTest(){redisTemplate.opsForValue().set("str","Hello World");String str = (String) redisTemplate.opsForValue().get("str");return str;
}

列表

@GetMapping("/list")
public List<String> listTest(){ListOperations<String,String> listOperations = redisTemplate.opsForList();listOperations.leftPush("list","Hello");listOperations.leftPush("list","World");listOperations.leftPush("list","Java");List<String> list = listOperations.range("list",0,2);return list;
}

集合

@GetMapping("/set")
public Set<String> setTest(){SetOperations<String,String> setOperations = redisTemplate.opsForSet();setOperations.add("set","Hello");setOperations.add("set","Hello");setOperations.add("set","World");setOperations.add("set","World");setOperations.add("set","Java");setOperations.add("set","Java");Set<String> set = setOperations.members("set");  //实际存进去只有三个return set;
}

有序集合

@GetMapping("/zset")
public Set<String> zsetTest(){ZSetOperations<String,String> zSetOperations = redisTemplate.opsForZSet();zSetOperations.add("zset","Hello",1);zSetOperations.add("zset","World",2);zSetOperations.add("zset","Java",3);  //有序的存储Set<String> set = zSetOperations.range("zset",0,2);return set;
}

哈希
HashMap key value
HashOperations key hashkey value
key 是每⼀组数据的 ID,hashkey 和 value 是⼀组完整的 HashMap 数据,通过 key 来区分不同的
HashMap。

HashMap hashMap1 = new HashMap();
hashMap1.put(key1,value1);
HashMap hashMap2 = new HashMap();
hashMap2.put(key2,value2);
HashMap hashMap3 = new HashMap();
hashMap3.put(key3,value3);HashOperations<String,String,String> hashOperations = redisTemplate.opsForHash();
hashOperations.put(hashMap1,key1,value1);
hashOperations.put(hashMap2,key2,value2);
hashOperations.put(hashMap3,key3,value3);

在这里插入图片描述

@GetMapping("/hash")
public Set<String> zsetTest(){HashOperations<String,String,String> hashOperations = redisTemplate.opsForHash();hashOperations.put("key","hashkey","value");return hashOperations.get("key");
}

Spring Boot 整合 Spring Security

Shiro、Spring Security
1、创建 Maven ⼯程,pom.xml

<parent><groupId>org.springframework.bootgroupId><artifactId>spring-boot-parentartifactId><version>2.1.5.RELEASEversion>
parent>
<dependencies><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-thymeleafartifactId>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-securityartifactId>dependency>
dependencies>

2、创建 Handler

package com.southwind.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloHandler {@GetMapping("/index")public String index(){return "index";}
}

3、创建 HTML

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head><body><h1>Hello World</h1></body>
</html>

4、创建 application.yml

spring:thymeleaf:prefix: classpath:/templates/suffix: .html

5、创建启动类 Application

package com.southwind.controller;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class,args);}
}

6、设置⾃定义密码

spring:thymeleaf:prefix: classpath:/templates/suffix: .htmlsecurity:user:name: adminpassword: 123123

权限管理

定义两个 HTML 资源:index.html、admin.html,同时定义两个⻆⾊ ADMIN 和 USER,ADMIN 拥有
访问 index.html 和 admin.html 的权限,USER 只有访问 index.html 的权限。
7、创建 SecurityConfig 类:

package com.southwind.config;@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().passwordEncoder(new MyPasswordEncoder()).withUser("user").password(new MyPasswordEncoder().encode("000")).roles("USER").and().withUser("admin").password(new MyPasswordEncoder().encode("123")).roles("ADMIN","USER");}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/admin").hasRole("ADMIN").antMatchers("/index").access("hasRole('ADMIN') or hasRole('USER')").anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll().and().csrf().disable();}
}

8、修改 Handler

package com.southwind.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloHandler {@GetMapping("/index")public String index(){return "index";}@GetMapping("/admin")public String admin(){return "admin";}@GetMapping("/login")public String login(){return "login";}
}

9、login.html

DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html lang="en">
<head><meta charset="UTF-8"><title>Titletitle>
head>
<body><form th:action="@{/login}" method="post">⽤户名:<input type="text" name="username"/><br/>密码:<input type="text" name="password"/><br/><input type="submit" value="登录"/>form>body>
html>

10、index.html

DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Titletitle>
head>
<body><h1>Hello Worldh1><form action="/logout" method="post"><input type="submit" value="退出"/>form>
body>
html>

11、admin.html

DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Titletitle>
head>
<body><h1>后台管理系统h1><form action="/logout" method="post"><input type="submit" value="退出"/>form>
body>
html>

Spring Boot 整合Shiro

什么是 Shiro

官网:http://shiro.apache.org/

是一款主流的 Java 安全框架,不依赖任何容器,可以运行在 Java SE 和 Java EE 项目中,它的主要作用是对访问系统的用户进行身份认证、授权、会话管理、加密等操作。

Shiro 就是用来解决安全管理的系统化框架。

Shiro 核心组件

用户、角色、权限

会给角色赋予权限,给用户赋予角色

1、UsernamePasswordToken,Shiro 用来封装用户登录信息,使用用户的登录信息来创建令牌 Token。

2、SecurityManager,Shiro 的核心部分,负责安全认证和授权。

3、Suject,Shiro 的一个抽象概念,包含了用户信息。

4、Realm,开发者自定义的模块,根据项目的需求,验证和授权的逻辑全部写在 Realm 中。

5、AuthenticationInfo,用户的角色信息集合,认证时使用。

6、AuthorzationInfo,角色的权限信息集合,授权时使用。

7、DefaultWebSecurityManager,安全管理器,开发者自定义的 Realm 需要注入到 DefaultWebSecurityManager 进行管理才能生效。

8、ShiroFilterFactoryBean,过滤器工厂,Shiro 的基本运行机制是开发者定制规则,Shiro 去执行,具体的执行操作就是由 ShiroFilterFactoryBean 创建的一个个 Filter 对象来完成。

Shiro 的运行机制如下图所示:
在这里插入图片描述
1、创建 Spring Boot 应用,集成 Shiro 及相关组件,pom.xml

<dependencies><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-thymeleafartifactId>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId>dependency><dependency><groupId>org.projectlombokgroupId><artifactId>lombokartifactId><optional>trueoptional>dependency><dependency><groupId>org.apache.shirogroupId><artifactId>shiro-springartifactId><version>1.5.3version>dependency><dependency><groupId>mysqlgroupId><artifactId>mysql-connector-javaartifactId>dependency><dependency><groupId>com.baomidougroupId><artifactId>mybatis-plus-boot-starterartifactId><version>3.3.1.tmpversion>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-testartifactId><scope>testscope><exclusions><exclusion><groupId>org.junit.vintagegroupId><artifactId>junit-vintage-engineartifactId>exclusion>exclusions>dependency>
dependencies>

2、自定义 Shiro 过滤器

package com.southwind.realm;import com.southwind.entity.Account;
import com.southwind.service.AccountService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;import java.util.HashSet;
import java.util.Set;public class AccoutRealm extends AuthorizingRealm {@Autowiredprivate AccountService accountService;/*** 授权* @param principalCollection* @return*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {//获取当前登录的用户信息Subject subject = SecurityUtils.getSubject();Account account = (Account) subject.getPrincipal();//设置角色Set<String> roles = new HashSet<>();roles.add(account.getRole());SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roles);//设置权限info.addStringPermission(account.getPerms());return info;}/*** 认证* @param authenticationToken* @return* @throws AuthenticationException*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;Account account = accountService.findByUsername(token.getUsername());if(account != null){return new SimpleAuthenticationInfo(account,account.getPassword(),getName());}return null;}
}

3、配置类

package com.southwind.config;import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import com.southwind.realm.AccoutRealm;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.Hashtable;
import java.util.Map;@Configuration
public class ShiroConfig {@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();factoryBean.setSecurityManager(securityManager);//权限设置Map<String,String> map = new Hashtable<>();map.put("/main","authc");map.put("/manage","perms[manage]");map.put("/administrator","roles[administrator]");factoryBean.setFilterChainDefinitionMap(map);//设置登录页面factoryBean.setLoginUrl("/login");//设置未授权页面factoryBean.setUnauthorizedUrl("/unauth");return factoryBean;}@Beanpublic DefaultWebSecurityManager securityManager(@Qualifier("accoutRealm") AccoutRealm accoutRealm){DefaultWebSecurityManager manager = new DefaultWebSecurityManager();manager.setRealm(accoutRealm);return manager;}@Beanpublic AccoutRealm accoutRealm(){return new AccoutRealm();}@Beanpublic ShiroDialect shiroDialect(){return new ShiroDialect();}
}

编写认证和授权规则:

认证过滤器

anon:无需认证。

authc:必须认证。

authcBasic:需要通过 HTTPBasic 认证。

user:不一定通过认证,只要曾经被 Shiro 记录即可,比如:记住我。

授权过滤器

perms:必须拥有某个权限才能访问。

role:必须拥有某个角色才能访问。

port:请求的端口必须是指定值才可以。

rest:请求必须基于 RESTful,POST、PUT、GET、DELETE。

ssl:必须是安全的 URL 请求,协议 HTTPS。

练习

创建 3 个页面,main.html、manage.html、administrator.html

访问权限如下:

1、必须登录才能访问 main.html

2、当前用户必须拥有 manage 授权才能访问 manage.html

3、当前用户必须拥有 administrator 角色才能访问 administrator.html

Controller:

package com.southwind.controller;import com.southwind.entity.Account;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class AccountController {@GetMapping("/{url}")public String redirect(@PathVariable("url") String url){return url;}@PostMapping("/login")public String login(String username, String password, Model model){Subject subject = SecurityUtils.getSubject();UsernamePasswordToken token = new UsernamePasswordToken(username,password);try {subject.login(token);Account account = (Account) subject.getPrincipal();subject.getSession().setAttribute("account",account);return "index";} catch (UnknownAccountException e) {e.printStackTrace();model.addAttribute("msg","用户名错误!");return "login";} catch (IncorrectCredentialsException e){model.addAttribute("msg","密码错误!");e.printStackTrace();return "login";}}@GetMapping("/unauth")@ResponseBodypublic String unauth(){return "未授权,无法访问!";}@GetMapping("/logout")public String logout(){Subject subject = SecurityUtils.getSubject();subject.logout();return "login";}
}

Shiro 整合 Thymeleaf

1、pom.xml 引入依赖

<dependency><groupId>com.github.theborakompanionigroupId><artifactId>thymeleaf-extras-shiroartifactId><version>2.0.0version>
dependency>

2、配置类添加 ShiroDialect

@Bean
public ShiroDialect shiroDialect(){return new ShiroDialect();
}

3、index.html

DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.thymeleaf.org/thymeleaf-extras-shiro">
<head><meta charset="UTF-8"><title>Titletitle><link rel="shortcut icon" href="#"/>
head>
<body><h1>indexh1><div th:if="${session.account != null}"><span th:text="${session.account.username}+'欢迎回来!'">span><a href="/logout">退出a>div><a href="/main">maina> <br/><div shiro:hasPermission="manage"><a href="manage">managea> <br/>div><div shiro:hasRole="administrator"><a href="/administrator">administratora>div>
body>
html>

【代码来源】 https://github.com/southwind9801/myspringclouddemo.git
【参考】楠哥教学视频
【可参考(我自己跟着练习写的)】https://github.com/monkeyhlj/spring-study


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部