SpringBoot笔记

1.yaml配置

server:
  port: 8081
  servlet:
    context-path: /rain #tomact写的项目地址
---
server:
  port:8082
spring:
  profiles: dev  #部署
---
server:
  port:8083
spring:
  profiles: test  #调试
  
#关闭模板引擎缓存
spring:
  thymeleaf:
  cache: false
  
  #配置国际化文件位置
  messages:
  basename: i18n\login
  #数据库配置
  datasource:
  username: root
  password: 123456
  url: jdbc:mysql://localhost:3306/stutext?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
  driver-class-name: com.mysql.cj.jdbc.Driver
  type: com.alibaba.druid.pool.DruidDataSource #druida连接池
  # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
  filters: stat,wall,slf4j
  # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
  connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
  #合并多个DruidDataSource的监控数据
  useGlobalDataSourceStat: true

2.静态资源位置

web配置类 WebMvcAutoConfiguration
http://localhost:8081/1.js
image

resources > static > public

3.Thymeleaf

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
public class ThymeleafProperties {
    private static final Charset DEFAULT_ENCODING;
    public static final String DEFAULT_PREFIX = "classpath:/templates/";
    public static final String DEFAULT_SUFFIX = ".html";
    private boolean checkTemplate = true;
    private boolean checkTemplateLocation = true;
    private String prefix = "classpath:/templates/";
    private String suffix = ".html";
    private String mode = "HTML";

使用:

@Controller // 返回视图   RestController 返回数据
public class HelloSpringBootControllet {
    @GetMapping("/hello")
    public String hello(Model model){
        model.addAttribute("mage","<h1>你好</h1>");
        return "index";
    }
}
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head></head>
<body>
	<div th:text="${mage}"></div>
	<div th:utext="${mage}"></div> //编译
</body>
</html>
th:href="@{/index.html(l='zn_CN')} // 超链接+参数
<input type="checkbox" value="remember-me"> [[#{login.remember}]] 
<h1  th:text="#{login.tip}">sign</h1> 
<form class="form-signin" th:action="@{/user/login}" method="post"> //表单提交

4.lombok

<!--lombok-->
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
</dependency>
@Data
@AllArgsConstructor  //所有的构造方法
@NoArgsConstructor   //无参构造方法
public class Department {
    private Integer id;
    private String depatmentName;
}

5.SpringMVC

XML配置


package com.rain.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

//实现接口,重写方法
@Configuration
public class MvcConfig implements WebMvcConfigurer {
    //视图跳转
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
	registry.addViewController("/index.html").setViewName("index");
        registry.addViewController("/dashboard.html").setViewName("dashboard");
    }
}

后台国际化

编写文件
image
实现接口,重写方法

//国际化解析器
public class MyLocaleResolver implements LocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
        String name = httpServletRequest.getParameter("l");

        Locale locale = Locale.getDefault(); //如果没有就是用默认的

        if (!StringUtils.isEmpty(name)) {
            String[] s = name.split("_");
            //国家地区
            locale = new Locale(s[0], s[1]);
        }
        return locale;
    }

装配

@Configuration
public class MvcConfig implements WebMvcConfigurer {
    @Bean
    public LocaleResolver localeResolver() {
        return new MyLocaleResolver();
    }

拦截器

package com.rain.config;
public class LoginHeadler implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Object loginname = request.getSession().getAttribute("loginname");
        if (1 != 1) {
            request.getRequestDispatcher("index.html").forward(request,response);
            return false;
        } else {
            return true;
        }
    }
public class MvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginHeadler()).
                addPathPatterns("/**").   //拦截全部
                excludePathPatterns("/"); //放行
    }

整合mybatis + druid

  1. 加依赖
 	<!--mybatis整合-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>


        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

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

        <!--druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.12</version>
        </dependency>
  1. yaml配置
  #数据库配置
spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/stutext?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource #druida连接池
    # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
    filters: stat,wall,slf4j
    # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
    #合并多个DruidDataSource的监控数据
    useGlobalDataSourceStat: true

#整合mybatis
mybatis:
  type-aliases-package: com.rain.domain  #重命名实体类,直接名字即可
  mapper-locations: classpath:mybatis/mapper/*.xml

3.编写mapper接口

@Mapper	     //映射
@Repository  //dao层注解
public interface CourseMapper {
    List<Course> queryList();
}

//映射也可以去扫描
@MapperScan("com.rain.ampper")
@SpringBootApplication //标注这个类是springboot的应用
public class DemoTextApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoTextApplication.class, args);
    }
}

4.编写xml
image

6.SpringSecurity

1.依赖

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

2.config配置

image

package com.rain.config;

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    //授权
    public 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().logoutSuccessUrl("/");

        //开启记住我 cookie保存两周
        http.rememberMe().rememberMeParameter("name");//name是标签的name属性
    }

    //认证
    //存在密码编码
    //加密 passwordEncoder
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("rain").password(new BCryptPasswordEncoder().encode("123")).roles("vip1","vip2")
                .and()
                .withUser("root").password(new BCryptPasswordEncoder().encode("123")).roles("vip1", "vip2", "vip3");
    }
}

7.shiro

1.依赖

<dependency>
	<groupId>org.apache.shiro</groupId>
	<artifactId>shiro-spring-boot-web-starter</artifactId>
	<version>1.7.1</version>
</dependency>

2.自定义UserRealm

package com.rain.config;

//自定义UserRealm
public class UserRealm extends AuthorizingRealm {
    @Autowired
    UserServicesImpl services;

    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection Collection) {
        System.out.println("+++++++++++++执行了授权");
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        //获得当前对象
        Subject subject = SecurityUtils.getSubject();
        User user = (User) subject.getPrincipal();

        info.addStringPermission(user.getState());//属性应该存到数据库
        return info;
    }

    //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("+++++++++++++执行了认证");
        //获取当前用户
        UsernamePasswordToken token1 = (UsernamePasswordToken) token;

        User user = services.queryUserByname(token1.getUsername());
        if (user == null){
            return null;//这里返回null表示name错
        }                              //第一个参数存入,上面授权才能拿到
        return new SimpleAuthenticationInfo(user,user.getPassword(),"");
        //最后返回比对密码,密码错误返回null表示密码错误,正确去授权
    }
}

3.ShiroConfig

package com.rain.config;

@Configuration //告诉springboot这是一个配置类,配置文件
public class ShiroConfig {

    @Bean(name = "shiroFilterFactoryBean")
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager) {
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        //设置安全管理器
        bean.setSecurityManager(defaultWebSecurityManager);

        //添加shiro过滤器
        /*
            anon : 无需认证就可以访问
            authc : 必须认证才能访问
            user : 必须拥有 记住我功能才能实现
            perms : 拥有对某个资源权限才能访问
            role : 拥有某个角色权限才能访问
         */
        Map<String, String> filterMap = new LinkedHashMap<>();
        //filterMap.put("/add", "authc"); //权限 支持*
        filterMap.put("/add","perms[user:add]");
        filterMap.put("/updata","perms[user:updata]");

        bean.setFilterChainDefinitionMap(filterMap);

        //设置登录的请求
        bean.setLoginUrl("/tologin");

        //设置未授权页面
        bean.setUnauthorizedUrl("/1.html");

        return bean;
    }

    //DefaultWebSecurityManager
    @Bean(name = "securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //关联UserRealm
        securityManager.setRealm(userRealm);
        return securityManager;
    }

    //给容器中添加组件,以方法名作为组件id,返回类型就是组件类型,返回的值就是组件在容器中的实例
    //创建Reaml对象,需要自定义类
    @Bean//name默认是方法名,也可以自定义
    public UserRealm userRealm() {
        return new UserRealm();
    }
}

4.登录请求处理

image

    @RequestMapping("/login")
    public String login(String username, String password, Model model) {
        //获取shiro工具
        Subject subject = SecurityUtils.getSubject();

        //封装用户登录信息
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);

        try {
            subject.login(token);//执行登录方法,没有异常就说明登陆成功
        } catch (UnknownAccountException e) {
            model.addAttribute("msg", "用户名错误");
            return "/login";
        } catch (IncorrectCredentialsException e) {
            model.addAttribute("msg", "密码错误");
            return "/login";
        }
        return "/index";
    }

5.shiro和springsecurity

在隐藏没有权限的页面时,需要加入整合依赖,装配和在html标签里面写属性

8.Swagger

1.依赖

<!--swagger-->
<dependency>
	<groupId>io.springfox</groupId>
	<artifactId>springfox-boot-starter</artifactId>
	<version>3.0.0</version>
</dependency>

<!-- 引入swagger-bootstrap-ui包 -->
<dependency>
	<groupId>com.github.xiaoymin</groupId>
	<artifactId>swagger-bootstrap-ui</artifactId>
	<version>1.8.3</version>
</dependency>

2.配置

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    @Profile("dev")
    public Docket creatRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
		.enable(b) //配置是否启用Swagger,如果是false,在浏览器将无法访问
		.select()// 通过.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
		.apis(RequestHandlerSelectors.basePackage("com.rain.swagger.controller"))
		// 配置如何通过path过滤,即这里只扫描请求以/hello开头的接口
		.paths(PathSelectors.ant("/hello/**"))
		.build();
    }

    //配置信息
    private ApiInfo apiInfo() {
        Contact DEFAULT_CONTACT = new Contact("rain", "", "");
        return new ApiInfo("Api Documentation",
                "Api Documentation",
                "1.0",
                "urn:tos",
                DEFAULT_CONTACT,
                "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList());
    }
}

3.访问地址

http://localhost:8080/swagger-ui/index.html  //传统界面

http://localhost:8080/doc.html  //bootstartui界面

4.配置分组

@Bean
public Docket docket1(){
   return new Docket(DocumentationType.SWAGGER_2).groupName("group1");
}
@Bean
public Docket docket2(){
   return new Docket(DocumentationType.SWAGGER_2).groupName("group2");
}
@Bean
public Docket docket3(){
   return new Docket(DocumentationType.SWAGGER_2).groupName("group3");
}

5.注释

@RestController
@Api(tags = "你好Controllet")
public class HelloControllet {

    @ApiOperation(value = "方法描述", tags = "重新分组", notes = "提示内容")
    @GetMapping("/hello")				 	//是否必须注释
    public String hello(@ApiParam(name="phone",value="用户手机号",required=true)String phone) {
        return "hello";
    }
}
//登录模型
@ApiModel
public class LoginVo {
    @ApiModelProperty("电话号码")
    private String mobile;
    @ApiModelProperty("密码")
    private String password;
}

9.任务

1.异步任务

@SpringBootApplication
@EnableAsync        //开启异步注解任务 Enable是开启什么权限
public class TaskApplication {
    public static void main(String[] args) {
        SpringApplication.run(TaskApplication.class, args);
    }
}


@Service
public class AsyncServices {
	@Async //方法添加注解 异步
	public void loding() {
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("数据正在处理");
	 }

2.发送邮箱

1.依赖

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

2.配置文件

spring.mail.username=24736743@qq.com
spring.mail.password=你的qq授权码
spring.mail.host=smtp.qq.com
# qq需要配置ssl
spring.mail.properties.mail.smtp.ssl.enable=true

3.调用

@Autowired
JavaMailSenderImpl mailSender;

@Test
public void contextLoads() {
   //邮件设置1:一个简单的邮件
   SimpleMailMessage message = new SimpleMailMessage();
   message.setSubject("通知-明天来狂神这听课");
   message.setText("今晚7:30开会");

   message.setTo("24736743@qq.com");
   message.setFrom("24736743@qq.com");
   mailSender.send(message);
}

@Test
public void contextLoads2() throws MessagingException {
   //邮件设置2:一个复杂的邮件
   MimeMessage mimeMessage = mailSender.createMimeMessage();
   MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);

   helper.setSubject("通知-明天来狂神这听课");
   helper.setText("<b style='color:red'>今天 7:30来开会</b>",true);

   //发送附件
   helper.addAttachment("1.jpg",new File(""));
   helper.addAttachment("2.jpg",new File(""));

   helper.setTo("24736743@qq.com");
   helper.setFrom("24736743@qq.com");

   mailSender.send(mimeMessage);
}

3.定时任务

TaskExecutor   	任务执行器
 
TaskScheduler	任务调度器   
    
@EnableScheduling   //开启定时任务 
    

Cron表达式

    //cron
    @Scheduled(cron = "0 * * * * 0-7")
    public void hello() {
        System.out.println("hello.....");
        
    }
posted @ 2021-08-05 08:47  慢慢呀  阅读(94)  评论(0)    收藏  举报