学习的知识点
1、Springboot静态资源映射
-
由来
- Springboot项目的资源在resource下无法直接访问,只有在templates和static目录下才可以访问,所以需要写一个配置类
-
解决方法
- 写一个WebMvcConfig,继承WebMvcConfigurationSupport,重写addResourceHandlers,参数的addResourceHandler方法是访问的路径,参数的addResourceLocations方法是将前面这个访问的路径换成访问项目下的路径
-
代码
-
@Slf4j @Configuration public class WebMvcConfig extends WebMvcConfigurationSupport { /** * 设置静态资源映射 * @param registry */ @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { log.info("开始进行静态资源映射!!!"); registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/"); registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/"); } }
-
2、SpringbootMD5加密
-
由来
- 数据库里的密码通常不是明文密码,所以要进行加密,MD加密是众多之一的一种
-
解决方法
- Springboot自带的DigestUtils类直接使用他的静态方法即可
-
代码
-
DigestUtils.md5DigestAsHex("123456".getBytes())
-
3、异常处理方法
-
由来
- 因为有些异常我们需要捕获而不是让他直接挂掉,捕获到之后通过需求展示出相应的结果
-
解决方法
- 编写一个GlobalExceptionHandler,在里面捕获对应的异常方法
-
代码
-
@ControllerAdvice(annotations = {RestController.class,Controller.class}) @ResponseBody @Slf4j public class GlobalExceptionHandler { /** * 异常处理方法 * @param ex * @return */ @ExceptionHandler(SQLIntegrityConstraintViolationException.class) public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){ log.error(ex.getMessage()); if(ex.getMessage().contains("Duplicate entry")){ String[] split = ex.getMessage().split(" "); String msg = split[2] + "已存在"; return R.error(msg); } return R.error("未知错误"); } }
-
4、分页处理
-
由来
- 因为大部分的后台页面都是管理,需要多条数据,这时候就不得不使用分页功能
-
解决方法
- 导入mybatisplus包
- 这里mybatisplus给我们提供了一些方法(pagehelper也好用)
- 编写一个配置类MybatisPlusConfig,因为是组件所以主启动类要加上ServletComponentScan注解扫描它
-
代码
-
@Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return mybatisPlusInterceptor; } }
-
@GetMapping("/page") public R<Page> page(int page,int pageSize,String name){ log.info("page = {},pageSize = {},name = {}",page,pageSize,name); //分页构造器 Page pageInfo = new Page(page,pageSize); //条件构造器 LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>(); //过滤条件 queryWrapper.like(StringUtils.isNotEmpty(name),Employee::getName,name); //排序条件 queryWrapper.orderByDesc(Employee::getUpdateTime); //执行查询 employeeService.page(pageInfo,queryWrapper); return R.success(pageInfo); }
-
5、过滤器使用
-
由来
- 一些页面未授权不能让请求直接访问,所以这时就需要拦截器
-
解决方法
- 编写一个拦截器LoginCheckFilter
- 这里用到了AntPathMatcher,一般定义成常量,match方法一般用来判断一个字符串在不在一个字符串数组里
-
代码
-
@WebFilter(filterName = "LoginCheckFilter",urlPatterns = "/*") @Slf4j public class LoginCheckFilter implements Filter { private static final AntPathMatcher PATH_MATCHER = new AntPathMatcher(); @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; //1、获取本次请求的url String requestURI = request.getRequestURI(); //定义不需要处理的请求路径 String[] urls = new String[]{ "/employee/login", "/employee/logout", "/backend/**", "/front/**" }; //2、判断本次请求是否需要处理 boolean check = check(urls,requestURI); //3、如果不需要处理,则直接放行 if(check){ log.info("本次请求{}不需要处理",requestURI); filterChain.doFilter(request,response); return; } //4、判断登录状态,如果已登录,则直接放行 if(request.getSession().getAttribute("employee") != null){ log.info("用户已登录,用户id为{}",request.getSession().getAttribute("employee")); filterChain.doFilter(request,response); return; } //5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据 log.info("用户未登录"); response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN"))); } public boolean check(String[] urls,String requestURI){ for (String url : urls) { boolean match = PATH_MATCHER.match(url, requestURI); if(match){ return true; } } return false; } }
-