SpringBoot框架整合

整合Druid数据源

Alibaba旗下的数据源依赖

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.21</version>
        </dependency>
没有配置之前class com.zaxxer.hikari.HikariDataSource
#    配置数据源
    type: com.alibaba.druid.pool.DruidDataSource

在这里插入图片描述

Druid相关文件的配置

spring:
  datasource:
    username: XXXX
    password: XXXX
    url: jdbc:mysql://localhost:3306/XXX?userUnicode=ture&characterEncoding=utf-8&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    initialSize: 5
    #最小连接池个数
    minIdle: 5
    #最大连接池个数
    maxActive: 20
    # 配置获取连接等待超时的时间,单位毫秒,缺省启用公平锁,并发效率会有所下降
    maxWait: 60000
    # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    timeBetweenEvictionRunsMillis: 60000
    # 配置一个连接在池中最小生存的时间,单位是毫秒
    minEvictableIdleTimeMillis: 300000
    # 用来检测连接是否有效的sql,要求是一个查询语句。
    # 如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用
    validationQuery: SELECT 1 FROM DUAL
    # 建议配置为true,不影响性能,并且保证安全性。
    # 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
    testWhileIdle: true
    # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
    testOnBorrow: false
    # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
    testOnReturn: false
    # 打开PSCache,并且指定每个连接上PSCache的大小
    poolPreparedStatements: true
    maxPoolPreparedStatementPerConnectionSize: 20
    # 通过别名的方式配置扩展插件,多个英文逗号分隔,常用的插件有:
    # 监控统计用的filter:stat
    # 日志用的filter:log4j
    # 防御sql注入的filter:wall
    filters: stat,wall,log4j
    # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
    # 合并多个DruidDataSource的监控数据
    useGlobalDataSourceStat: true

配置Druid

@Configuration
public class Druid {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druidDataSource(){
        return  new DruidDataSource();
    }
    //后台监控
    @Bean
    public ServletRegistrationBean  statViewServlet(){
        ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
        //后台需要有人进行登录 账号密码需要进行配置
        HashMap<String,String> initParameters = new HashMap<>();
        //增加配置
        initParameters.put("loginUsername","admin");
        initParameters.put("loginPassword","123456");
        //允许谁可以访问
        initParameters.put("allow","");
        //禁止谁访问
//        initParameters.put("","");
        bean.setInitParameters(initParameters);
        return bean;
    }

在这里插入图片描述

执行一条sql语句之后查看数据源

在这里插入图片描述
在这里插入图片描述
以及各种监控系统

配置过滤器

    //filter
    @Bean
    public FilterRegistrationBean webStatFilter(){
        FilterRegistrationBean bean=new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());
        //可以过滤哪一些请求
        Map<String,String> initParameters=new HashMap<>();
        //这些东西不进行统计也就是放行
        initParameters.put("exclusion","*.js,*.css,/druid/*");
        bean.setInitParameters(initParameters);
        return bean;
    }

整合mysql数据库

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

yaml中文件配置
在这里插入图片描述

  • 连接测试
    @Autowired
    DataSource dataSource;
    @Test
    void contextLoads() throws SQLException {
        Connection connection = dataSource.getConnection();
        System.out.println("连接成功"+connection);
        connection.close();
    }
  • 查询语句
    JdbcTemplate jdbcTemplate;
    @Autowired
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
    @GetMapping("/userList")
    public List<Map<String,Object>> userList(){
        String sql="select * from books";
        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
        return list;
    }

整合mybatis框架

导入启动依赖

<!--        mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>
        <!--        lombok依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>
  • 实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class books {
    private int bookId;
    private String bookName;
    private int bookCounts;
    private String detail;
}
  • Mapper接口
@Repository
@Mapper
public interface BooksMapper {
    List<books> queryAllBooks();
}
  • mapper文件位置
    在这里插入图片描述
  • 识别文件位置
mybatis:
  type-aliases-package: com.springboot_02.pojo
  mapper-locations: classpath:mapper/*.xml
  • xml内容
<mapper namespace="com.springboot_02.mapper.BooksMapper">

    <!-- 增删改查标签来写sql语句 -->
    <select id="queryAllBooks" resultType="books">
        select * from books where bookID=6
    </select>
</mapper>
  • 测试
@Controller
public class MybatisController {
    BooksMapper booksMapper;
    @Autowired
    public void setBooksMapper(BooksMapper booksMapper) {
        this.booksMapper = booksMapper;
    }
    @GetMapping("/queryAllBooks")
    @ResponseBody
    public List<books> queryAllBooks(){
        List<books> list = booksMapper.queryAllBooks();
        for (books books : list) {
            System.out.println(books);
        }
        return list;
    }
}

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

  • 整合完毕

整合SpringSecurity

环境搭建

  <!--thymeleaf依赖-->
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-java8time</artifactId>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring5</artifactId>
        </dependency>

在这里插入图片描述

index.html

<h2><a th:href="@{/level1/1}">level 1-1</a></h2>
<h2><a th:href="@{/level1/2}">level 1-2</a></h2>
<h2><a th:href="@{/level1/3}">level 1-3</a></h2>
<h2><a th:href="@{/level2/1}">level 1-1</a></h2>
<h2><a th:href="@{/level2/2}">level 2-2</a></h2>
<h2><a th:href="@{/level2/3}">level 2-3</a></h2>
<h2><a th:href="@{/level3/1}">level 3-1</a></h2>
<h2><a th:href="@{/level3/2}">level 3-2</a></h2>
<h2><a th:href="@{/level3/3}">level 3-3</a></h2>
    @RequestMapping({"/", "/index"})
    public String index(){
        return "index";
    }
    @RequestMapping("/level1/{id}")
    public String level1(@PathVariable("id") int id){
        return "views/level1/"+id;
    }
    @RequestMapping("/level2/{id}")
    public String level2(@PathVariable("id") int id){
        return "views/level2/"+id;
    }
    @RequestMapping("/level3/{id}")
    public String level3(@PathVariable("id") int id){
        return "views/level3/"+id;
    }
  • SpringSecurityConfigerAdapter 自定义Security策略
  • AuthenticationManagerBuilder : 自定义认证策略
  • @ EnableWebSecuriet :开启WebSecurity 策略
    SpringSecurity两个主要的目标是认证和授权(访问控制)
  • "认证”:Authentication
  • “授权” :authentiZation

导入Security依赖

<!--        security-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
配置 授权&认证
//AOP思想
@EnableWebSecurity
public class Security extends WebSecurityConfigurerAdapter {
    //链式编程
    //授权
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //首页所有人均可以访问,功能只有有对应权限的人才可以访问
        http.authorizeRequests().antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");
        //没有权限跳到登录界面 默认的
        http.formLogin();
        //开启注销功能
        //注销之后跳到首页
//        http.logout().logoutUrl("/");
        http.logout().logoutSuccessUrl("/");
    }

认证

//认证
    //密码编码 PasswordEncoder
    //添加加密方法
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //数据库中读取数据
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("jiaSen").password(new BCryptPasswordEncoder().encode("123456")).roles("vip2")
                .and()
                .withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1")
                .and()
                .withUser("guest").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1");
    }
  • 默认的登录页面
    在这里插入图片描述

访问没有权限的页面

在这里插入图片描述

有权限的界面

在这里插入图片描述

注销

在这里插入图片描述

与thymeleaf整合springSecurity

在这里插入图片描述

前后端连调

在这里插入图片描述

根据身份来显示的 div

在这里插入图片描述

普通的thyme leaf语法也可以是实现相关操作

<div th:if="${session.user.==''}"></div>
演示

在这里插入图片描述

        http.csrf().disable();//关闭csrf功能
  • CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解: 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。 如下:其中Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户。

  • CSRF攻击攻击原理及过程如下:
    1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
    2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
    3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
    4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
    5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行

网站记住我功能

 http.rememberMe();
 //开启记住我功能 cookie默认保存 两周

在这里插入图片描述

首页定制操作

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

自定义参数时

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值