简答题1. Spring Profiles的作用是什么?
Spring Profiles允许用户根据不同的配置文件来注册bean。指定不同的spring.profiles.active值就可以加载不同的配置文件,例如,在测试环境中启动服务,在工程的application.properties中或在启动参数中指定spring.profiles.active值为test,就会加载application-test.properties中的配置参数,同理,在生产环境启动时,只需要指定spring.profiles.active为prod,就会加载application-prod.properties文件的配置参数。这样就可以预先在不同的配置文件中配置好相应参数,在启动时根据不同环境指定spring.profiles.active的值来启动,就可以加载需要的配置文件。让服务在不同环境中使用不同的配置文件变得更简单。
[考点] Spring Boot
2. Spring Data JPA与JPA的区别?
JPA (Java Persistence API)是一种持久层规范,也是EJB3规范的一部分,并不是一个ORM框架,只是定义了一些API,但没提供具体实现,它的作用是使得应用程序以统一的方式访问持久层。
Spring Data JPA是在JPA规范的基础上提供了一个JPA数据访问抽象,同时也大大简化了持久层的CRUD操作。但它并不是一个JPA的实现,Hibernate才是JPA的一个实现。
3. 如何理解网页标准和标准制定机构的重要性?
网页标准和标准制定机构都是为了能让Web发展的更健康,开发者遵循统一的标准,降低开发难度和开发成本,有利于SEO,减少因为滥用代码导致各种BUG、安全问题,最终提高网站易用性。
[考点] Html5与Web编程综合
4. Spring JDBC如何与Springboot集成?
在pom.xml文件添加Spring JDBC的starter依赖spring-boot-starter-jdbc,配置好数据源。在DAO类中注入JdbcTemplate,就完成了Spring JDBC与Spring Boot的集成。
[考点] Spring JDBC框架
5. Nginx是如何处理一个请求的?
首先,Nginx在启动时,会解析配置文件,得到需要监听的端口与lP地址,然后在Nginx的Master进程里面先初始化好这个监控的Socket,再进行Listen。然后再Fork出多个子进程,子进程会竞争Accept新的连接。此时,客户端就可以向Nginx发起连接了。
当客户端与Nginx进行三次握手,与Nginx建立好一个连接后,此时,某一个子进程会Accept成功,然后创建Nginx对连接的封装,即ngx_connection_t结构体。接着,根据事件调用相应的事件处理模块,如HTTP模块与客户端进行数据的交换。
最后,Nginx或客户端来主动关掉连接,到此,一个连接请求就处理完成。
[考点] Nginx
6. 什么是Spring Cloud?使用Spring Cloud有什么优势?
Spring Cloud基于Spring Boot实现,整合并管理各个微服务,为各个微服务之间提供协调与配置管理、服务注册与发现、熔断限流、路由、事件消息总线、消息队列、负载均衡、监控、链路追踪等集成服务,是微服务架构的完整解决方案。它整合了诸多被广泛实践和证明过的框架作为实施的基础部件,并且自身也提供了很多优秀的功能组件,从而形成一个完整的微服务架构体系。
[考点] Spring Cloud与微服务架构
7. 如何获取浏览器与操作系统等信息?
HttpServletRequest提供了getHeader("User-Agent")来获取浏览器的完整信息,想知道简明的信息,仍然需要自己去处理。这里推荐一个好的工具类UserAgentUtils,能够更容易地获取更多更全面的信息。首先要引入依赖:
<dependency>
<groupId>eu.bitwalker</groupId>
<artifactId>UserAgentUtils</artifactId>
<version>1.21</version>
</dependency>
引入依赖后,就可以使用UserAgentUtils这个工具类了,它提供了很多方法来获取信息。当然也可以通过UserAgent来获取很多信息。如:
UserAgent userAgent=UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
Browser browser=userAgent.getBrowser();
Version version=browser.getVersion(request.getHeader("User-Agent"));
这样就获取了浏览器信息与浏览器的版本信息。更多方法,读者可以自行了解。这里主要是抛砖引玉。
[考点] HTML5与Web编程综合
8. 在Mongodb中如何删除文档?
Mongodb利用remove()方法删除集合中的文档。可以从一个集合中删除所有文档,删除匹配一个条件的所有文档,或者限制操作只删除一条文档。remove()方法有两个可选参数:
remove()方法参数名
|
参数的含义
|
deletion criteria
|
(可选)删除文档的标准。
|
JustOne
|
(可选)如果设为true或1,则只删除一个文档。默认 值false。
|
删除匹配条件的文档,方法格式如:
>db.collection.remove({Key: value})
如果要删除集合中的所有文档,方法格式如:
>db.collection.remove({})
但是这时不会删除索引,如果用drop()方法,则会删除整个集合和所有索引。
删除一条匹配条件的文档,则只要将justOne参数设为1或true便可。如:
>db.collection.remove({Key:value},1)
[考点] Mongodb
9. 如何禁用某个自动配置类?
使用注解@EnableAutoConfiguration的exclude属性,可以禁用一个或多个特定的自动配置类。例如:
@EnableAutoConfiguration(exclude=(MyAutoConfig.class))
如果类不在类路径上,开发者可以使用注解的excludeName属性并指定完全限定名称。例如:
@EnableAutoCon figuration(excludeName={Cat.class})
另外,在Spring Boot中使用spring.autoconfigure.exclude属性可以配置要排除的自动配置类列表。在application.properties中如下配置(如多个用逗号分隔):
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
[考点] Spring Boot
10. RabbitMQ消息基于什么传输?它的Message最大可达多大?
RabbitMQ使用信道的方式来传输数据。信道是建立在真实的TCP连接内的虚拟连接,且每条TCP连接上的信道数量没有限制。之所以不是直接基于TCP连接来传输数据,是由于TCP连接的创建和销毁开销较大,且并发数受系统资源限制,会造成性能瓶颈。
根据AMQP协议规定,RabbitMQ消息体的大小由64-bit的值来指定,所以可以由此得出最大能发多大的数据了。
[考点] 消息队列综合
11. 下面是一道综合题,要求写出多种条件下的查询SQL语句,这里仍以MySQL数据库为基础,其他数据库可参考实现。
假定公司有员工表employee和部门表department。employee表结构如下:
create table employee(
id int primary key,
first_name varchar (30),
last_name varchar (30),
salary float(8,2), //薪资
hireddate date, //雇用日期
depid int);
department表结构如下:
create table department (depid int primary key, depname varchar (50));
1)基于employee表写出查询:查出雇用日期在今年、工资在[1000,2000]之间、或员工姓名(last_name)以“Fu”开头的所有员工的全部个人信息。
答案:查询SQL为:
select * from employee where Year(hiredDate) =Year(now()) or (salary between 1000 and 200) or left (last_name,3)='Fu';
2)基于上述employee表写出查询:查出部门平均工资大于1800元的部门的所有员工的全部个人信息。
答案:查询SQL为:
select * from employee a wheredepid in (select depid from employee group by depid having avg (salary)>1800);
3)基于employee表写出查询:查出个人工资高于其所在部门平均工资的员工,列出这些员工的全部个人信息及该员工工资高出部门平均工资的百分比。
查询SQL为:
select a.*, (a.salary - t.avgSalary) * 100/a.salary from employee a, (select depid, avg (salary) avgSalary from employee group by depid)t where a.depid=t.depid and a.salary> t.avgSalary;
[考点] SQL语法与实战
12. 什么是MVC模式?
MVC即模型(Model) -视图(View) -控制器(Controller),MVC模式将一个应用分成三个层即模型层、视图层、控制层。视图(View)层是与用户交互界面,负责数据展现。业务流程的处理由模型层处理。控制层负责视图层与模型层的交互(一般是一个Servlet)。MVC模式有助于管理复杂的应用程序,可以在一个时间内专门关注于程序实现的一个方面。例如,开发人员可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。MVC模式实现了数据展现与业务逻辑的分离,提高了系统的可移植性、维护性。
最典型的MVC模式就是JSP+Servlet+JavaBean的模式。
MVC框架处理请求的过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果,并通过视图呈现给用户。
[考点] 综合
13. MyBatis如何获取自增长主键?
MyBatis的insert方法默认是返回一个代表插入行数的int值,自动生成的键值在方法执行完后可以被赋值到传入的参数对象中。但默认是不传入的,需要配置。如果是XML映射文件,则如下配置。
<insert id="insert" useGeneratedKeys= "true" keyProperty="id">
如果是注解,则如下配置。
@Options (useGeneratedKeys =true, keyProperty="id")
int insert();
两种方式其实是一样的,useGeneratedKeys指定是否获取自增长主键,keyProperty指定主键列。
[考点] MyBatis
14. Struts2框架里创建Action类有几种方法?
创建Action类有三种方法:
1)实现Action接口。
2)继承ActionSupport类,这时必须实现execute()方法。
3)使用Struts2的元注解@Action。
[考点] Struts2
15. Nginx如何根据扩展名限制程序和文件访问?
出于安全性,Web项目需要限制对一些特定文件(如模板文件,配置文件等)的直接访问。这些可以通过在Nginx中增加特定配置来做到。如下所示:
location~*\.(cfg |template |txt)${#cfg |template |txt就是需要限制访问的文件扩展名
deny all;
}
[考点] Nginx
16. 定制Dockerfile需要注意些什么?
下面是一些定制Dockerfile的经验,与大家共享。
1)尽量让每个镜像的用途都比较集中、单一,避免构造大而复杂、多功能的镜像。
2)尽量选择精简小巧的基础镜像,否则镜像可能很臃肿。例如,使用Java作为基础镜像,如果使用Java:8为基础镜像,工程镜像可能达到600多MB大小;而使用Java: openJdk-8-jre只有100多MB大小。
3)提供详细的注释和维护者信息,方便别人使用。
4)不要使用latest,尽量使用明确的具体数字信息的版本号,这样可以避免无法确认具体版本号,利于统一环境。
5)使用.dockeringore文件来排除构建镜像时不需要的文件或目录(如临时和缓存文件等),让镜像更精简。
6)调整合理的指令顺序,在开启缓存的情况下,内容不变的指令尽量放在前面,这样可以提高指令的复用性。
7)要让Dockerfile文件尽量少受到外部源的干扰,尽量具有通用性,可通过定制接受合适的外部参数来增强文件的通用性。
8)尽量合并RUN指令,可以将多条RUN指令的内容通过&&连接,这样可以减少镜像层数。
[考点] Docker
17. profile有何作用?具体如何使用?
profile可用来分析SQL性能的消耗分布情况。当用explain无法解决SQL慢时,需要用profile来对SQL进行更细致地分析,找出SQL所花的时间大部分消耗在了哪个部分,确认SQL的性能瓶颈。
profile是在MySQL 5.0.3版本以后才开放的,在MySQL 5.7之后,profile信息将逐渐被废弃,MySQL推荐使用performance schema。
下面简单介绍一下它的具体使用,推荐在MySQL的命令行工具下操作。
打开分析命令:
set profiling=1;
然后可以执行查询SQL,可以一条或多条。
查看SQL语句的汇总分析命令:
show profiles;
找到查询所对应的Query_ID,查看具体情况:
show profile for query2;
想查看完整的分析情况,执行命令:
show profile ALL for query2;
会显示更多列的信息,可以重点看CPU和I/O等的具体信息,这里相关的信息太多,不一一介绍。
关闭分析命令:
set profiling=0;
关闭之后,不再监控后面的操作,但关闭之前的监控信息会存在,也是可以用查看命令查看的。
[考点] MySQL数据库
18. 什么是SQL注入攻击?如何防范SQL注入攻击?
SQL注入(SQL Injection)是在输入参数中添加SQL代码,传递到服务器,这些输入参数被拼接到SQL语句中,并能被数据库解析执行,从而达到攻击目的的一种攻击手法。
SQL注入攻击具有很大的危害性,攻击者可以利用它获取、修改或者删除数据库内的数据,获取数据库中的用户名和密码等敏感信息,甚至可以获得数据库管理员的权限等。
如何防止SQL注入呢?
严格检查输入变量的类型和格式。
●对过滤或转义特殊字符进行检查。
●尽量使用预编译,而不要使用拼接SQL。使用预编译时,传人的参数会作为字符串处理,不会被解析。使用拼接SQL则会整体作为SQL语句被解析执行。
[考点] 软件安全知识
19. 如何处理错误"Full authentication is required to access this resource"?
如果出现此错误消息,可用如下两种方法处理。
1)关闭安全验证,在application.properties增加如下配置:
management.security.enabled=false
2)将实际使用的密码传递至请求标头中。
[考点] Spring Boot
20. 如何理解Memcached内存管理机制原理?
Memcached使用了自身设计的内存管理机制,默认使用Slab Allocation机制管理内存,其主要思想是按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的Key-value数据记录,以完全解决内存碎片问题。Slab Allocation机制只为存储外部数据而设计,也就是说所有的Key-value数据都存储在Slab Allocation系统里,而Memcached的其它内存请求则通过普通的malloc/free来申请,因为这些请求的数量和频率决定了它们不会对整个系统的性能造成影响。
[考点] Memcached