.
1.Vue常见的命令包括:
以上都是常见的以v-开头的vue命令,主要包括项目创建、开发、测试、构建等生命周期的命令。
-
主要的vue常见命令以v-开头有:
-
vue create: 创建一个新项目
-
vue serve: 本地开发服务器,热重载功能
-
vue build: 生产环境构建,将会构建并优化项目
-
vue inspect: 检查项目的依赖关系
-
vue add: 添加功能,如添加vuex、路由等
-
vue router: 路由相关命令
-
vue test:unit: 单元测试
-
vue test:e2e: 端到端测试
-
vue ui: 图形化用户界面,用于管理创建和维护项目
-
vue devtools: vue开发者工具,用于调试vue组件
-
vue-cli-service: 辅助 vue-cli 的命令行接口
-
vue-cli-plugin: 创建 vue-cli 插件
-
vue-cli-plugin-xxx: 各种官方和第三方插件
2.session和cookie的区别
- 存储位置:
- session存储在服务器端,cookie存储在客户端浏览器。
- 数据量:
- session数据量较大,可以存储更多信息,cookie数据量较小,一般不超过4k。
- 有效期:
-
session依赖于浏览器或浏览器tab的打开,只要浏览器或tab不关闭,session就一直有效。
-
cookie有效期可以设置,一般默认关闭浏览器窗口后失效,也可以设置为定时失效。
- 安全性:
- session存储在服务器端,相对更安全。cookie保存在客户端,数据在传输过程中可能被截取。
- 使用范围:
- session只能在同一个服务器识别同一个用户。cookie可以被所有服务器读取。
- 实现机制:
-
session通过sessionID保存到服务器上,在请求时通过cookie或URL传递sessionID实现。
-
cookie直接保存到客户端浏览器上。
总之,session用于服务器端会话管理,cookie用于客户端信息存储。session数据量大,但依赖于浏览器;cookie数据量小,但可以跨请求使用。
3.什么是转发,什么是重定向,他们有什么区别。
所以总体来说,转发保留请求信息,重定向只能在URL中传参,转发在服务器内部进行,重定向需要两次请求。
- 请求方式不同:
-
转发是服务器内部的操作,客户端看不到转发,URL地址栏不变,还是原来的请求。
-
重定向需要客户端重新发起请求,URL地址栏会发生变化,显示重定向后的地址。
- 传参不同:
-
转发可以保留请求中的所有信息,包括请求参数、Attribute等。
-
重定向只能在URL地址中传递参数,请求域对象会丢失。
- 响应不同:
-
转发只产生一个响应,客户端看不出来有跳转发生。
-
重定向会产生两次响应,一次返回重定向指令,一次返回新的页面。
- 地址栏不同:
-
转发地址栏URL不变
- 性能不同:
-
转发性能较好,只产生一次请求。
-
重定向需要两次请求,性能略差。
-
重定向地址栏URL会变成重定向后的地址
4.常见的响应码有哪些?提示404
-
404 Not Found: 请求的资源不存在。
-
200 OK: 请求成功。
-
301 Moved Permanently: 请求的资源已永久移动到新位置。
-
302 Found: 临时重定向。
-
304 Not Modified: 请求的资源未修改,从缓存中返回资源。
-
400 Bad Request: 请求语法错误,服务器无法理解。
-
401 Unauthorized: 请求未经授权,需要用户登录。
-
403 Forbidden: 服务器理解请求但拒绝响应。
-
404 Not Found: 请求的资源不存在。
-
500 Internal Server Error: 服务器内部错误,无法完成请求。
-
502 Bad Gateway: 网关错误。
-
503 Service Unavailable: 服务器暂时无法处理请求(可能过载或维护),一段时间后可重新尝试。
其中404表示请求的资源(页面、图片、文件等)在服务器上不存在,是最常见的错误码之一。其他如200、301、500也很常见。
5.你所知道的请求方式和响应方式有哪些?
请求方式:
-
GET: 获取资源。请求参数在URL中。
-
POST: 提交资源到服务器。请求参数在请求体中。
-
PUT: 更新资源。
-
DELETE: 删除资源。
-
HEAD: 获取资源报头。
-
OPTIONS: 获取支持的请求方法。
-
PATCH: 对资源进行部分更新。
响应方式:
-
HTML: 最常见的响应格式,用于渲染网页。
-
JSON: JavaScript对象表示法,用于API接口响应。
-
XML: 基于标签的响应格式。
-
Plain Text: 纯文本响应。
-
Image: 图片格式响应如JPG、PNG等。
-
Download: 用于文件下载的响应。
其他还有:
-
CONNECT: 用于建立隧道,通常用于SSL。
-
TRACE: 回显服务器收到的请求,用于测试或诊断。
-
LINK、UNLINK: 操作链接资源。
所以常见的请求方式有GET、POST等,响应方式主要有HTML、JSON、XML、Plain Text等格式。不同的请求方式和响应格式在不同场景下使用。
6.spring创建对象,注入,代替配置文件等常用注解有哪些(16个)
-
@Configuration:代替配置类
-
@ComponentScan:指定要扫描的包
-
@Import:导入其他配置类
-
@PropertySource:引入配置文件
-
@Component:将类标记为可自动扫描的组件
-
@Autowired:自动注入依赖
-
@Qualifier:指定特定的注入bean
-
@Resource:= @Autowired + @Qualifier 自动装配通过名称进行装配。
-
@Value:属性注入
-
@Controller:标识为控制器类
-
@Service:标识为服务类
-
@Repository:标识为数据访问类
-
@Component :标识为其他类
-
@Configuration:标识配置类
-
@Bean:定义bean
-
@Scope:定义bean的作用域
-
@Conditional:条件装配等。
7.springmvc常用请求和响应注解有哪些?
响应注解:
其他:
以上是Spring MVC常用的请求和响应注解,主要用于请求映射、参数绑定和响应处理等方面。
-
请求注解:
-
@RequestMapping: 用来映射请求URL到处理方法。
-
@GetMapping: 专为HTTP GET请求映射。
-
@PostMapping: 专为HTTP POST请求映射。
-
@PutMapping: 专为HTTP PUT请求映射。
-
@DeleteMapping: 专为HTTP DELETE请求映射。
-
@PathVariable: 绑定URI模板变量到方法参数。
-
@ResponseBody: 将对象直接写入HTTP响应体中。
-
@RestController: 相当于@Controller和@ResponseBody的组合注解。
-
@ModelAttribute: 绑定请求参数或模型数据到方法参数。
-
@RequestHeader: 绑定请求头到方法参数。
-
@CookieValue: 绑定Cookie值到方法参数。
-
@ExceptionHandler: 处理控制器异常。
-
@InitBinder: 初始化数据绑定器。
-
@SessionAttributes: 绑定会话属性。
-
@RequestParam: 绑定请求参数到方法参数。
8.springmvc处理日期请求和响应的注解和怎么使用?
-
@DateTimeFormat:用于格式化日期/时间字符串,可以设置日期格式。
-
@JsonFormat:用于Jackson序列化/反序列化日期类型数据,也可以设置日期格式。
- @RequestParam:可以直接将请求参数绑定到Date类型的参数上。
-
@InitBinder:数据绑定回调方法,用于处理请求参数和类型转换
-
@ResponseBody:可以直接将Date类型响应写出,会自动序列化为字符串。
-
@RequestBody:将请求体内容转为日期对象等。
9.springmvc执行流程
-
1、DispatcherServlet接收请求。
-
2、DispatcherServlet根据请求信息调用HandlerMapping,获得相应的Handler。
-
3、HandlerMapping根据请求URL找到具体的Controller类和处理方法。
-
4、DispatcherServlet调用HandlerAdapter,根据Handler获得适配器。
-
5、HandlerAdapter调用具体的Controller处理方法。
-
6、Controller处理后返回ModelAndView对象。
-
7、HandlerAdapter将Controller处理结果封装为ModelAndView对象返回给DispatcherServlet。
-
8、DispatcherServlet调用ViewResolver解析视图名称。
-
9、ViewResolver根据视图名称获取具体View对象实例。
-
10、DispatcherServlet调用View渲染视图,将模型数据填充到请求域中。
-
11、View将页面展示到客户端。
-
12、DispatcherServlet响应客户端,流程结束。
-
总体来说,Spring MVC通过DispatcherServlet分发请求到对应的Controller,Controller处理后返回ModelAndView,ViewResolver解析视图并渲染页面输出响应结果。其中HandlerMapping和HandlerAdapter负责请求到处理器的映射与适配。
10.springmvc 拦截器
Spring MVC 拦截器是一个非常强大的功能,用于实现请求前后处理功能,比如登录检查、权限检查、数据校验等。
Spring MVC 拦截器的简述:
-
拦截器实现HandlerInterceptor接口,重写其中的三个方法:preHandle、postHandle、afterCompletion。
-
preHandle方法在Controller处理之前执行,返回true则继续执行后续操作,返回false则中断后续操作。
-
postHandle方法在Controller处理之后执行,但在视图渲染之前执行。
-
afterCompletion方法在整个请求处理完成之后执行,如渲染视图等。
-
在Spring MVC配置文件中配置拦截器,设置拦截规则,如拦截所有URL等。
-
拦截器支持链式调用,每个拦截器的三个方法都会依次执行。
常见使用场景:
- 登录检查:在preHandle中检查用户是否登录
- 权限检查:检查用户权限
- 数据校验:对表单数据进行校验
- 日志记录:记录请求日志
- 性能监控:记录请求时间
- 防止重复提交:检查表单重复提交
等通过配置Spring MVC拦截器可以实现许多通用的前后处理功能,如安全控制、数据处理等。
- 注解配置:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor());
}
}
- JavaConfig方式:
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
@Bean
public HandlerInterceptor loginInterceptor() {
return new LoginInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor());
}
}
- 直接new对象注册:
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor());
}
}
- WebMvcConfigurer适配器:
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor());
}
}
所以总体来说,完全在Java代码中实现Spring MVC拦截器主要有注解配置、JavaConfig方式和实现WebMvcConfigurer接口三种方式,无需任何XML配置。
11.springAOP用到了什么设计模式,以及他的特点
所以总体来说,Spring AOP采用了代理模式、装饰器模式、观察者模式和模板方法模式,实现了无侵入式的面向切面编程功能。
- 代理模式(Proxy Pattern)
-
Spring AOP就是通过为目标对象创建代理对象来实现切面功能的。它使用JDK动态代理或CGLIB代理来为目标对象创建代理。
- 装饰器模式(Decorator Pattern)
-
Spring AOP的切面装饰目标对象,为其添加额外的功能,这也是装饰器模式的一种实现方式。
- 观察者模式(Observer Pattern)
-
Spring AOP的切面类实现了Advice接口,可以看作是观察者,目标对象执行切入点时会通知观察者进行拦截。
- 模板方法模式(Template Method Pattern)
-
Spring AOP通过Advice定义通知逻辑,目标方法通过调用流程模板执行通知逻辑,这也是模板方法模式。
Spring AOP的主要特点:
-
不修改源代码实现功能增强,通过代理和装饰器模式。
-
面向切面编程,清晰划分关注点与功能模块。
-
基于动态代理,运行期动态织入增强逻辑。
-
采用基于接口的代理模式,不受限于类的继承关系。
-
支持多种切面类型,如前置通知、后置通知等。
12.写一个springAOP程序有哪些步骤,增强的几个关键元素是什么?
-
定义一个接口或者抽象类,作为切入点签名。
-
定义一个实现类,实现接口或者继承抽象类,作为目标对象。
-
定义一个切面类,使用@Aspect注解。
-
在切面类中使用@Before、@AfterReturning等注解定义通知方法。
-
使用@Pointcut定义切入点表达式。
-
在Spring配置文件中开启注解驱动和组件扫描。
-
配置AOP代理,可以使用@EnableAspectJAutoProxy注解。
-
注入组件并测试功能增强是否生效。
Spring AOP的关键元素包括:
-
切入点(Pointcut):需要增强的方法签名。
-
通知(Advice):增强逻辑,如前置通知、后置返回通知等。
-
切面(Aspect):切入点和通知的结合。
-
目标对象(Target):被通知的对象。
-
AOP代理(Proxy):使用代理为目标对象创建代理对象。
所以通过定义切入点、通知和切面,注入到Spring容器,即可实现面向切面的功能增强。
13.mybatis中#和$区别是什么?
#:
-
表示映射语句中的参数,如 #{id}。
-
MyBatis 会将 # 后面的内容解析为 OGNL 表达式进行动态设置。
-
#{id} 表示使用 id 参数进行设置。
$ :
-
表示映射语句中的列名或表名等,如 select * from user where id = #{id}
-
MyBatis 不会对 $ 后面的内容进行解析,直接将其作为普通字符串使用。
-
${tableName} 直接输出 tableName 字符串,不会解析为表达式。
区别:
-
表示参数,MyBatis 会对其内容进行解析;
-
$ 表示普通字符串,MyBatis 不会对其内容进行解析。
使用场景:
-
一般用于参数设置,如 #{id}、#{param.name}
-
一般用于表名、字段名等需要输出字符串的场景,如一般用于表名、字段名等需要输出字符串的场景,如{tablePrefix}user
所以,#表示需要动态解析的表达式参数,#{xx}会被解析替换;表示普通字符串,表示普通字符串,{xx}输出字符串而不会被替换。这是 MyBatis 中 # 和 $ 符号的主要区别。
14.mybatis中常见的动态sql有哪些?批量操作是怎么做的
- if标签
根据条件包含where子句,实现条件查询。
- choose、when、otherwise标签
类似switch的多条件选择,选择性执行标签体内的SQL代码块。
- where标签
自动删掉多余的and字样。
- set标签
自动删掉多余的,号。
- foreach标签
迭代列表,构建IN条件或为每个对象执行更新/插入操作。
- trim标签
自定义删除额外的and/或字符。
- bind标签
从OGNL表达式中提取出值,并绑定到标签体内。
- sql标签
定义可重用的SQL代码块。
- include标签
插入外部sql文件内容。
foreach标签可以循环处理列表中的每个对象,为每个对象生成SQL语句。
15.短信登录流程是什么样的
-
用户输入手机号,点击获取验证码按钮。
-
服务端校验手机号格式是否正确,生成4-6位随机验证码。
-
服务端调用短信接口,将验证码通过短信下发到用户手机。
-
用户收到验证码后,在登录页面输入收到的验证码。
-
客户端将手机号和验证码提交到服务端。
-
服务端从数据库或Redis中查询该手机号对应的验证码是否正确:
-
如果正确,生成登录token返回给客户端。
-
如果错误,返回错误提示用户重新输入验证码。
-
客户端收到token后,将token保存在本地存储如cookie中。
-
后续请求都在请求头或参数中携带token。
-
服务端从数据库或缓存中查询token是否有效:
-
如果有效,代表用户已登录。
-
如果无效,返回未登录状态。
- 登录成功后,客户端可以访问需要登录的页面或接口功能。
16.统一异常处理怎么实现的
- 自定义异常类
定义通用的异常类如BusinessException,其他异常类继承该异常类。
- 全局异常处理类
实现HandlerExceptionResolver接口,重写resolveException方法,进行全局异常处理。
- AOP异常拦截
使用AOP定义异常切面,对指定包或类的异常进行拦截和处理。
- ControllerAdvice异常处理
使用@ControllerAdvice注解的类进行全局异常处理,类似HandlerExceptionResolver。
- 配置异常映射
在SpringMVC配置中配置异常映射,指定异常类和错误视图。
具体实现:
-
自定义异常类层次
-
定义ExceptionHandler类实现HandlerExceptionResolver
-
在类或方法上使用@ExceptionHandler注解处理异常
-
使用@ControllerAdvice和@ExceptionHandler注解处理全局异常
-
SpringMVC配置异常映射关系
-
AOP定义异常切面进行拦截处理
以上方式可以统一捕获异常,进行日志记录、错误码处理等操作,实现系统层面的异常统一处理机制。
17.如何创建一个springboot项目,有哪些步骤,用到哪些注解
-
创建一个简单的Spring Boot项目主要步骤和使用到的关键注解如下:
-
创建Maven项目,指定项目的打包方式为jar
-
添加Spring Boot相关的starter依赖,如spring-boot-starter-web
-
定义主程序入口类,添加@SpringBootApplication注解
-
编写Controller类,添加@RestController注解
-
定义接口方法,添加@RequestMapping注解
-
编写业务逻辑代码
通过这些关键注解,可以快速创建一个基础的Spring Boot项目。主要步骤是创建Maven项目,添加依赖,定义主程序入口和Controller接口,编写业务代码并运行启动。
此外还可以使用:
@Autowired:自动注入Bean @Bean:注册Bean @Configuration:标注配置类
其中:
@SpringBootApplication:标注主程序类,启用自动配置和组件扫描
@RestController:标注Controller类,支持Restful风格接口
@RequestMapping:标注接口方法,定义请求URL映射规则
-
运行主程序,启动项目
18.spring怎么解决数据库事务问题的,事务什么时候失效
Spring中解决数据库事务问题的主要方式有:
-
使用@Transactional注解标注事务方法。
-
配置TransactionManager事务管理器,使用TransactionTemplate或TransactionStatus直接管理事务。
事务的失效情况:
-
方法执行异常导致事务回滚。如果方法内部抛出异常,事务将回滚。
-
显式调用transactionManager.rollback()回滚事务。如果手动调用回滚,事务不会提交。
-
事务超时未提交就会回滚。Spring默认如果事务在一定时间内未完成,会回滚事务。
-
事务上下文发生错误也会回滚。如果事务管理发生错误,如无法获取连接,也会回滚。
-
事务配置propagation级别不支持当前调用栈。不同的propagation类型决定事务如何在方法间传播。
所以总结来说,事务会在以下情况失效(回滚而不是提交成功):
- 方法内部抛出异常
- 手动调用回滚
- 事务超时
- 事务管理错误
- propagation配置不匹配
只有方法正常返回且未手动回滚时,事务才会成功提交。其他情况都有可能导致事务回滚。
19.mybatis的一级缓存和二级缓存分别是什么样的,有什么区别,什么时候缓存失效
一级缓存(SqlSession级别):
-
作用域:SqlSession。同一个SqlSession查询同一个sql,多次查询直接从缓存中读取。
-
失效条件:SqlSession关闭或提交事务、手动清空缓存。
二级缓存(Mapper级别):
-
作用域:同一个Mapper下的所有SqlSession。不同SqlSession可以共享查询结果。
-
失效条件:
- 缓存配置clearCache标签设置为true时,会清空缓存
- 缓存配置flushInterval时间到时,会刷新缓存
- 缓存配置size限制超出时,会刷新缓存
- 缓存配置readWrite属性为true时,根据sql的写操作决定是否清空缓存
- 映射文件配置statement标签的flushCache属性为true时,会清空缓存
区别:
- 一级缓存作用在SqlSession,二级缓存作用在Mapper
- 一级缓存自动工作,二级缓存需要手动配置开启
- 一级缓存范围小,二级缓存范围大
- 一级缓存默认存在,二级缓存需要满足一定条件才生效
所以一级缓存粒度小,但范围小;二级缓存粒度大,但需要额外配置。
20.系统登录权限怎么做的?短信登录怎么实现的
- 权限管理
- 用户表存储用户信息和权限信息
- 权限表存储权限点定义
- 用户-权限关系表绑定用户和权限
- 登录认证
- 用户名/手机号+密码登录
- 短信验证码登录
- 发送验证码到手机
- 验证验证码
- 登录流程
- 用户名/手机号+密码登录
- 验证用户名/手机号和密码
- 生成登录token返回
- 短信验证码登录
- 发送验证码到手机
- 验证手机号和验证码
- 生成登录token返回
- token验证
- 登录后返回token
- 后续请求携带token在header中
- 服务端验证token有效性
- 权限验证
- 获取用户权限信息
- 权限点匹配请求URL权限检查
- 权限不足返回无权限
短信登录实现:
- 发送短信验证码接口
- 验证短信验证码接口
- 登录生成token
- token验证后续请求
以上方式可以实现系统登录认证和权限控制,支持用户名密码登录和短信验证码登录两种模式。
21.系统的角色权限是怎么控制?
- 定义角色和权限表
角色表存储各个角色信息,权限表存储各个权限点信息。
- 角色-权限关系表
建立角色和权限的多对多关系表,记录每个角色拥有哪些权限。
- 用户-角色关系表
建立用户和角色的多对多关系表,记录每个用户拥有哪些角色。
- 权限点编码
为每个可以访问的页面、API等定义唯一的权限点编码。
- 权限校验
- 获取当前用户的角色
- 通过角色查询用户拥有的权限点
- 对比请求需要的权限点是否被允许
- 动态菜单
- 根据用户角色动态生成侧边菜单
- 只展示用户拥有权限的菜单项
- 细粒度控制
可以为每个权限点细分更多子权限点,实现更细粒度的控制。
通过上述方式,可以实现基于角色的访问控制,动态生成不同角色的界面菜单,达到细粒度的权限管理目标。
22.为什么使用redis
- 速度快
-
Redis是内存存储,读写速度远远超过磁盘存储,很适合需要高性能的场景。
- 支持不同的数据类型
-
Redis不仅仅支持简单的key-value类型,还提供list,set,zset,hash等数据类型,更丰富的数据结构。
- 可靠性好
-
Redis支持持久化,可以将数据保存到磁盘或者复制到其他Redis服务器,在一定程度上保证了数据的安全性。
- 适合缓存
-
Redis作为缓存架构非常合适,可以有效缓解数据库的压力,提高网站/APP的性能和响应速度。
- 发布订阅功能
-
Redis的发布订阅功能可以实现不同系统或组件之间的无缝通信,用于构建实时应用。
- 集群支持
-
Redis支持主从复制和哨兵机制,可以横向扩展实现集群,提高可用性。
- 社区活跃
-
Redis社区活跃,开源版本更新频繁,生态圈成熟,使用和扩展都很容易。
- 多种语言客户端
-
Redis支持多种语言的客户端库,与主流语言无缝集成。
所以总体来说,Redis因其高性能、数据类型丰富、可靠性好等优点,广泛应用于缓存、消息队列、实时应用等场景。
23.自定义注解怎么写,用在什么场景下
-
定义注解 使用@Retention和@Target注解定义注解的目标和生命周期。
-
使用注解 在需要使用的位置添加自定义注解。
-
处理注解 通过反射获取注解信息,并进行相应处理。
常见使用场景:
-
参数校验:添加参数校验注解,实现参数校验功能。
-
日志记录:标注需要记录日志的方法。
-
事务管理:标注事务方法,实现事务控制。
-
缓存:标注需要缓存结果的方法,实现方法结果缓存。
-
权限控制:标注需要权限校验的方法。
-
序列化:标注需要序列化的类。
-
版本控制:标注API版本号。
-
多环境配置:标注需要读取不同环境配置文件的类或方法。
通过自定义注解可以给代码添加元数据,方便后续处理通用功能,如校验、事务控制、缓存等。一般用于给类、方法、属性添加标识或配置信息。使用注解可以实现跨切面功能而无需修改原代码。这就是自定义注解常见的定义、使用和应用场景。
24.动态代理
动态代理是一种在运行时根据已经存在的类来扩展其功能的技术。
动态代理的主要实现方式有以下两种:
- JDK动态代理
JDK动态代理需要接口,它会在运行时动态生成一个实现了指定接口的子类,并覆盖其中的所有方法。
实现步骤:
- 定义接口
- 实现InvocationHandler接口
- 使用Proxy.newProxyInstance()方法创建代理对象
- CGLIB动态代理
CGLIB动态代理不需要接口,它通过在运行时对目标类进行子类化来生成代理类,覆盖其中的方法。
实现步骤:
- 引入CGLIB依赖
- 实现MethodInterceptor接口
- 使用Enhancer.create()方法创建代理对象
动态代理的主要应用场景包括:
- 事务处理:为方法添加事务管理功能
- 日志记录:为方法添加日志记录功能
- 权限检查:为方法添加权限检查功能
- 声明式事务:使用Spring AOP实现声明式事务
- 缓存处理:为方法结果添加缓存功能
等通过动态代理可以在不修改目标类代码的情况下,给方法添加共性功能的场景。它通过代理模式提高了代码的可扩展性和复用性。