面试题答案
一键面试技术选型
- 跨域:
- CORS(Cross - Origin Resource Sharing):在服务端配置CORS头信息,允许特定源进行跨域访问。在主流Web框架中都有成熟的解决方案,如在Spring Boot中,可以通过
@CrossOrigin
注解或者配置WebMvcConfigurer
的addCorsMappings
方法来设置允许的源、方法、头信息等。例如:
- CORS(Cross - Origin Resource Sharing):在服务端配置CORS头信息,允许特定源进行跨域访问。在主流Web框架中都有成熟的解决方案,如在Spring Boot中,可以通过
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://allowed - origin.com")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*");
}
}
- **反向代理**:使用Nginx等反向代理服务器来处理跨域问题。通过配置Nginx的`location`块,设置`add_header`来添加CORS相关头信息。例如:
location / {
add_header Access - Control - Allow - Origin http://allowed - origin.com;
add_header Access - Control - Allow - Methods GET, POST, PUT, DELETE;
add_header Access - Control - Allow - Headers *;
proxy_pass http://backend - server;
}
- 安全性:
- 身份验证与授权:
- JWT(JSON Web Token):用于用户身份验证和授权。用户登录成功后,服务端生成JWT并返回给客户端,客户端在后续请求中将JWT放在请求头中。服务端验证JWT的有效性和权限信息。例如在Java中,使用
jjwt - api
、jjwt - impl
、jjwt - jacob
等库来处理JWT。
- JWT(JSON Web Token):用于用户身份验证和授权。用户登录成功后,服务端生成JWT并返回给客户端,客户端在后续请求中将JWT放在请求头中。服务端验证JWT的有效性和权限信息。例如在Java中,使用
- 身份验证与授权:
// 生成JWT
String token = Jwts.builder()
.setSubject(user.getUsername())
.claim("roles", user.getRoles())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + expirationTime))
.signWith(SignatureAlgorithm.HS256, secretKey)
.compact();
// 验证JWT
Claims claims = Jwts.parserBuilder()
.setSigningKey(secretKey)
.build()
.parseClaimsJws(token)
.getBody();
- **OAuth 2.0**:适用于第三方应用授权场景,如用户使用第三方账号登录。可以使用Spring Security OAuth2等框架来实现。
- **加密**:
- **传输层加密**:使用HTTPS协议,通过SSL/TLS证书对传输数据进行加密。在Nginx中配置HTTPS非常简单,只需要配置SSL证书路径和密钥路径即可。例如:
server {
listen 443 ssl;
server_name your - domain.com;
ssl_certificate /path/to/your - certificate.crt;
ssl_certificate_key /path/to/your - private - key.key;
location / {
proxy_pass http://backend - server;
}
}
- **数据加密**:对于敏感数据在存储和传输时进行加密,如使用AES算法对用户密码等数据进行加密。在Java中,可以使用`javax.crypto`包来实现AES加密。
3. 高性能: - 负载均衡: - Nginx:作为反向代理和负载均衡器,Nginx可以根据不同的负载均衡算法(如轮询、IP哈希等)将请求均匀分配到多个后端微服务实例上。例如:
upstream backend {
server backend1.example.com;
server backend2.example.com;
}
server {
listen 80;
server_name your - domain.com;
location / {
proxy_pass http://backend;
}
}
- **Ribbon**:在Spring Cloud微服务架构中,Ribbon是客户端负载均衡器。通过在服务调用方配置Ribbon,可以实现对服务提供方的负载均衡。例如在`application.yml`中配置:
service - name:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
- **缓存**:
- **Redis**:可以缓存经常访问的数据,如用户信息、配置信息等。在Spring Boot中集成Redis非常方便,通过引入`spring - boot - starter - data - redis`依赖,配置Redis服务器地址等信息,就可以使用`RedisTemplate`或`StringRedisTemplate`来操作缓存。例如:
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public Object getFromCache(String key) {
return redisTemplate.opsForValue().get(key);
}
public void setToCache(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
}
配置细节
- CORS配置细节:
- 允许的源:要谨慎配置,避免设置为
*
,除非是开发环境。生产环境应明确列出允许的源,防止跨域攻击。 - 允许的方法和头信息:只允许实际需要的HTTP方法和头信息,减少潜在风险。
- 允许的源:要谨慎配置,避免设置为
- 安全性配置细节:
- JWT:
- 密钥管理:密钥要足够复杂且保密,定期更换。
- 过期时间:合理设置JWT的过期时间,既要保证用户体验,又要防止长时间未验证带来的安全风险。
- HTTPS:
- 证书管理:使用正规CA颁发的证书,定期更新证书,避免证书过期导致服务不可用。
- JWT:
- 高性能配置细节:
- 负载均衡:
- 健康检查:配置负载均衡器对后端服务进行健康检查,及时移除不健康的实例,确保请求只发送到可用的服务上。在Nginx中可以使用
health_check
模块。
- 健康检查:配置负载均衡器对后端服务进行健康检查,及时移除不健康的实例,确保请求只发送到可用的服务上。在Nginx中可以使用
- 缓存:
- 缓存策略:设置合理的缓存过期时间,对于经常变化的数据设置较短的过期时间,对于不常变化的数据设置较长的过期时间。同时,要处理好缓存穿透、缓存雪崩和缓存击穿等问题。可以使用布隆过滤器来防止缓存穿透,通过设置不同的过期时间来避免缓存雪崩,使用互斥锁来解决缓存击穿。
- 负载均衡: