整合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默认保存 两周
首页定制操作
自定义参数时