微信公众号:Java修炼手册
关注可领取3T编程资料及面试题解。问题或建议,请公众号留言;
希望我的分享对你有所帮助
SpringBoot介绍
Spring Boot的主要优点:
为所有Spring开发者更快的入门
开箱即用,提供各种默认配置来简化项目配置
内嵌式容器简化Web项目
没有冗余代码生成和XML配置的要求
SpringBoot访问静态文件
所有的资源文件都应该在src/main/resources文件夹下面,但在SpringBoot中,系统默认扫描静态文件在static或者public文件夹下,默认扫描的配置文件是application.yml或者application.properties.
SpringBoot异常捕获
以前我们全局捕获异常得写切面去捕获,现在不用了,SpringBoot帮你封装好了,我们直接用就好了
@ExceptionHandler 表示拦截异常
@ControllerAdvice 是 controller 的一个辅助类,最常用的就是作为全局异常处理的切面类
@ControllerAdvice 可以指定扫描范围
@ControllerAdvice 约定了几种可行的返回值,如果是直接返回 model 类的话,使用@ResponseBody进行json转换
1@ControllerAdvice
2public class GlobalExceptionHandler {
3
4 @ExceptionHandler(RuntimeException.class)
5 @ResponseBody
6 public Map<String, Object> exceptionHandler() {
7 Map<String, Object> map = new HashMap<String, Object>();
8 map.put("errorCode", "404");
9 map.put("errorMsg", "找不到页面了!");
10 return map;
11 }
12 }
13}
SpringBoot集成Mybatis
引入jar包
1<dependency>
2 <groupId>org.mybatis.spring.boot</groupId>
3 <artifactId>mybatis-spring-boot-starter</artifactId>
4 <version>1.1.1</version>
5</dependency>
6<dependency>
7 <groupId>mysql</groupId>
8 <artifactId>mysql-connector-java</artifactId>
9 <version>5.1.21</version>
10</dependency>
在application.properties中填写连接数据库相关的配置信息
1spring.datasource.url=jdbc:mysql://localhost:3306/springboot_demo
2spring.datasource.username=root
3spring.datasource.password=root
4#如果是mysql8会有所不同
5spring.datasource.driver-class-name=com.mysql.jdbc.Driver
6#mybatis.mapper-locations=classpath:mapper/*.xml
如此简单的就可以编写代码访问你的数据库的数据了
SpringBoot事务管理
事物的四大特性(ACID):
原子性:对于其数据修改,要么全都执行,要么全都不执行。
一致性:事务在完成时,必须使所有的数据都保持一致状态。
隔离性:由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。
持久性:事务完成之后,它对于系统的影响是永久性的。
在SPringBoot中处理事务很简单,只需要一个注解,其他的SpringBoot自动帮我们实现,在方法上加上@Transactional注解,当方法执行出现错误,同一请求在他之前执行的对数据库的操作会进行回滚
SpringBoot集成Shiro安全框架
Apache Shiro是Java的一个安全框架。目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的Shiro就足够了。对于它俩到底哪个好,这个不必纠结,能更简单的解决项目问题就好了。
Shiro有哪些功能:身份认证/登录,授权,会话管理,加密,Web支持。。。。
记住这么一点,Shiro不会去维护用户、维护权限;这些需要我们自己去设计/提供;通过Realm让开发人员自己注入。
引入jar包
1<dependency>
2 <groupId>org.apache.shiro</groupId>
3 <artifactId>shiro-spring</artifactId>
4 <version>1.4.0</version>
5</dependency>
6<dependency>
7 <groupId>org.apache.shiro</groupId>
8 <artifactId>shiro-ehcache</artifactId>
9 <version>1.4.0</version>
10</dependency>
然后在src/main/resources下新建一个关于shiro的缓存配置文件ehcache-shiro.xml
1<?xml version="1.0" encoding="UTF-8"?>
2<ehcache updateCheck="false" name="cacheManagerConfigFile">
3<defaultCache
4 maxElementsInMemory="10000"
5 eternal="false"
6 timeToIdleSeconds="120"
7 timeToLiveSeconds="120"
8 overflowToDisk="false"
9 diskPersistent="false"
10 diskExpiryThreadIntervalSeconds="120"
11 memoryStoreEvictionPolicy="LRU"/>
12 <cache name="shiro-activeSessionCache"
13 eternal="false"
14 maxElementsInMemory="10000"
15 overflowToDisk="false"
16 timeToIdleSeconds="0"
17 timeToLiveSeconds="0"
18 statistics="true"/>
19</ehcache>
然后新建一个Shiro的配置文件ShiroConfig并注解@Configuration,这个配置只不过把最初的spring-shiro.xml形式的配置文件转成了java文件,内容和xml形式完全一致
1@Configuration
2public class ShiroConfiguration {
3 /**
4 * ShiroFilterFactoryBean 处理拦截资源文件问题。
5 * 注意:单独一个ShiroFilterFactoryBean配置是或报错的,以为在
6 * 初始化ShiroFilterFactoryBean的时候需要注入:SecurityManager
7 * Filter Chain定义说明 1、一个URL可以配置多个Filter,使用逗号分隔 2、当
8 设置多个过滤器时,全部验证通过,才视为通过
9 * 3、部分过滤器可指定参数,如perms,roles
10 */
11 @Bean
12 public ShiroFilterFactoryBean shirFilter(org.apache.shiro.mgt.SecurityManager securityManager) {
13 ShiroFilterFactoryBean shiroFilterFactoryBean = new
14 ShiroFilterFactoryBean();
15
16 // 必须设置 SecurityManager
17 shiroFilterFactoryBean.setSecurityManager(securityManager);
18
19 // 拦截器.
20 Map<String, String> filterChainDefinitionMap = new
21 LinkedHashMap<String, String>();
22 //配置静态资源允许访问
23 filterChainDefinitionMap.put("/js/**","anon");
24 filterChainDefinitionMap.put("/css/**","anon");
25 filterChainDefinitionMap.put("/index","anon");
26 // <!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名 访问-->
27 filterChainDefinitionMap.put("/**", "authc");
28 // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
29 shiroFilterFactoryBean.setLoginUrl("/login");
30 // 未授权界面;
31 shiroFilterFactoryBean.setUnauthorizedUrl("/403");
32 Map<String, Filter> filters=new HashMap<String,Filter>();
33 shiroFilterFactoryBean.setFilters(filters);
34 shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefiniti
35 onMap);
36 return shiroFilterFactoryBean;
37 }
38
39 @Bean
40 public EhCacheManager getEhCacheManager() {
41 EhCacheManager em = new EhCacheManager();
42 em.setCacheManagerConfigFile("classpath:ehcache-shiro.xml");
43 return em;
44 }
45 // 开启Controller中的shiro注解
46 @Bean
47 public DefaultAdvisorAutoProxyCreator
48 getDefaultAdvisorAutoProxyCreator() {
49 DefaultAdvisorAutoProxyCreator daap = new
50 DefaultAdvisorAutoProxyCreator();
51 daap.setProxyTargetClass(true);
52 return daap;
53 }
54 /**
55 * 配置org.apache.shiro.web.session.mgt.DefaultWebSessionManager
56 * @return
57 */
58 @Bean
59 public DefaultWebSessionManager getDefaultWebSessionManager(){
60 DefaultWebSessionManager defaultWebSessionManager=new
61 DefaultWebSessionManager();
62 defaultWebSessionManager.setSessionDAO(getMemorySessionDAO());
63 defaultWebSessionManager.setGlobalSessionTimeout(4200000);
64
65 defaultWebSessionManager.setSessionValidationSchedulerEnabled(true);
66 defaultWebSessionManager.setSessionIdCookieEnabled(true);
67 defaultWebSessionManager.setSessionIdCookie(getSimpleCookie());
68 return defaultWebSessionManager;
69 }
70 /**
71 * 配置org.apache.shiro.session.mgt.eis.MemorySessionDAO
72 * @return
73 */
74 @Bean
75 public MemorySessionDAO getMemorySessionDAO(){
76 MemorySessionDAO memorySessionDAO=new MemorySessionDAO();
77 memorySessionDAO.setSessionIdGenerator(javaUuidSessionIdGenerator());
78 return memorySessionDAO;
79 }
80 @Bean
81 public JavaUuidSessionIdGenerator javaUuidSessionIdGenerator(){
82 return new JavaUuidSessionIdGenerator();
83 }
84 /**
85 * session自定义cookie名
86 * @return
87 */
88 @Bean
89 public SimpleCookie getSimpleCookie(){
90 SimpleCookie simpleCookie=new SimpleCookie();
91 simpleCookie.setName("security.session.id");
92 simpleCookie.setPath("/");
93 return simpleCookie;
94 }
95 @Bean
96 public LifecycleBeanPostProcessor getLifecycleBeanPostProcessor(){
97 return new LifecycleBeanPostProcessor();
98 }
99 @Bean(name = "securityManager")
100 public DefaultWebSecurityManager getDefaultWebSecurityManager(UserRealm userRealm) {
101 DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager();
102 dwsm.setRealm(userRealm);
103 // <!-- 用户授权/认证信息Cache, 采用EhCache 缓存 -->
104 dwsm.setCacheManager(getEhCacheManager());
105 m.setSessionManager(getDefaultWebSessionManager());
106 return dwsm;
107 }
108 @Bean
109 public UserRealm userRealm(EhCacheManager cacheManager) {
110 UserRealm userRealm = new UserRealm();
111 userRealm.setCacheManager(cacheManager);
112 return userRealm;
113 }
114 /**
115 * 开启shrio注解支持
116 * @param userRealm
117 * @return
118 */
119 @Bean
120 public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor(UserRealm userRealm){
121 AuthorizationAttributeSourceAdvisor aasa=new
122 AuthorizationAttributeSourceAdvisor();
123 aasa.setSecurityManager(getDefaultWebSecurityManager(userRealm));
124 return aasa;
125 }
126}
然后写一个UserRealm做登录权限控制:
1public class UserRealm extends AuthorizingRealm {
2 @Override
3 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
4 // 这里做权限控制
5 return null;
6 }
7 @Override
8 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws
9 AuthenticationException {
10 // 这里做登录控制
11 return null;
12 }
13}
基本上shiro的集成使用就到这里了,着重的要集成shiro到SpringBooot里面去。完全不会shiro的请自行查看资料学习基础
SpringBoot使用AOP统一处理请求日志
这里就提到了Spring当中的AOP,也就是面向切面编程,使用AOP对所有请求进行一个统一处理。首先在pom.xml中引入aop的jar包
1<dependency>
2 <groupId>org.springframework.boot</groupId>
3 <artifactId>spring-boot-starter-aop</artifactId>
4</dependency>
然后新建一个Aspect去对所有Controller进行一个日志拦截。在SPringBoot中使用AOP也是很简单的,只需要在类上加上一个@Aspect的注解就好了,然后通过@Component注入到Spring容器中去。
新建一个包com.test.log专门用来放日志记录,代码如下:
1@Aspect
2@Component
3@Slf4j
4public class MjxyLogAspect {
5 @Pointcut("execution(public * com.test.controller..*.*(..))")
6 public void webLog() {
7 }
8 @Before("webLog()")
9 public void doBefore(JoinPoint joinPoint) throws Throwable {
10 // 接收到请求,记录请求内容
11 ServletRequestAttributes attributes = (ServletRequestAttributes)
12 RequestContextHolder.getRequestAttributes();
13 HttpServletRequest request = attributes.getRequest();
14 // 记录下请求内容
15 log.info("URL : " + request.getRequestURL().toString());
16 log.info("HTTP_METHOD : " + request.getMethod());
17 log.info("IP : " + request.getRemoteAddr());
18 Enumeration<String> enu = request.getParameterNames();
19 while (enu.hasMoreElements()) {
20 String name = (String) enu.nextElement();
21 log.info("name:{},value:{}", name, request.getParameter(name));
22 }
23 }
24 @AfterReturning(returning = "ret", pointcut = "webLog()")
25 public void doAfterReturning(Object ret) throws Throwable {
26 // 处理完请求,返回内容
27 log.info("RESPONSE : " + ret);
28 }
29}
SpringBoot定时任务@Scheduled
在方法上使用此注解即可
在启动器上使用@EnableScheduling开启定时器,非常简单
这里就不一一介绍了,可以领取资料完成学习。