面试-springMVC
1. SpringMVC执行流程
1.1 视图阶段(JSP)

- 用户发送出请求到前端控制器DispatcherServlet
- DispatcherServlet收到请求调用HandlerMapping(处理器映射器)
- HandlerMapping找到具体的处理器(controller中的某个方法),生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet。
- DispatcherServlet调用HandlerAdapter(处理器适配器)
- HandlerAdapter经过适配调用具体的处理器(Handler/Controller)
- Controller执行完成返回ModelAndView对象
- HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet
- DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)
- ViewReslover解析后返回具体View(视图)
- DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
- DispatcherServlet响应用户
1.2 前后端分离阶段(接口)

- 用户发送出请求到前端控制器DispatcherServlet
- DispatcherServlet收到请求调用HandlerMapping(处理器映射器)
- HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet。
- DispatcherServlet调用HandlerAdapter(处理器适配器)
- HandlerAdapter经过适配调用具体的处理器(Handler/Controller)
- 方法上添加了@ResponseBody
- 通过HttpMessageConverter来返回结果转换为JSON并响应
2. 过滤器和拦截器的区别
- 过滤器适用于所有Web应用的通用处理,而拦截器则更适用于特定Web框架的业务逻辑处理。
2.1 工作层次
过滤器(Filter):
工作在Web容器(如Tomcat)层面,属于Servlet规范的一部分。
主要作用是对进入Servlet容器的请求和响应进行预处理和后处理,可以过滤和修改请求和响应内容。
通常用于实现一些通用的功能,如日志记录、编码设置、安全检查等。
拦截器(Interceptor):
- 工作在框架(如Spring MVC)层面,不属于Servlet规范的一部分。
- 主要作用是对进入控制器(Controller)之前和之后的处理,可以拦截方法的调用。
- 常用于实现与业务逻辑紧密相关的功能,如用户认证、权限检查、事务管理等。
2.2 实现方式
过滤器(Filter):
需要实现
javax.servlet.Filter接口。通过配置
web.xml文件或使用注解(如@WebFilter)来注册和映射过滤器。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 预处理
System.out.println("Filter is called before request processing");
chain.doFilter(request, response); // 调用下一个过滤器或目标资源
// 后处理
System.out.println("Filter is called after request processing");
}
@Override
public void destroy() {
}
}
拦截器(Interceptor):
在Spring MVC中,拦截器需要实现
HandlerInterceptor接口或继承其实现类。通过配置类或XML文件来注册和映射拦截器。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 预处理
System.out.println("Interceptor is called before request processing");
return true; // 返回true,继续执行;返回false,中断执行
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 后处理
System.out.println("Interceptor is called after request processing");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 完成处理
System.out.println("Interceptor is called after view rendering");
}
}1
2
3
4
5
6
7
8
9
10
11import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
}
2.3 使用场景
- 过滤器(Filter):
- 适合于所有Web应用,不局限于某个框架。
- 适用于处理通用的请求和响应,比如请求日志记录、设置字符编码、实现跨域访问、过滤敏感词等。
- 拦截器(Interceptor):
- 依赖于具体的Web框架,如Spring MVC。
- 适用于处理与业务逻辑相关的功能,比如权限验证、用户认证、记录业务操作日志等。
2.4 生命周期
- 过滤器(Filter):
- 生命周期由Servlet容器管理,随着Web应用的启动和停止而初始化和销毁。
- 拦截器(Interceptor):
- 生命周期由Web框架管理,随着应用上下文的创建和销毁而初始化和销毁。
2.5 作用范围
过滤器(Filter):
- 可以作用于所有的请求,包括静态资源的请求。
拦截器(Interceptor):
- 主要作用于处理器(Controller)方法调用之前和之后,不会拦截静态资源的请求。
3. Cookie、Session、JWT的区别
3.1 Cookie
- 定义:Cookie是由服务器生成并发送给客户端的小数据文件,保存在客户端浏览器中。
- 存储位置:存储在客户端浏览器中。
- 生命周期:可以设置有效期,默认为会话期间(浏览器关闭后失效)。也可以设置长时间有效的持久化Cookie。
- 用途:
- 保存用户偏好设置和登录状态。
- 跟踪用户会话。
- 安全性:不适合存储敏感信息,容易受到XSS攻击。可以通过设置
HttpOnly和Secure标志增加安全性。 - 大小限制:每个Cookie大小限制为4KB。
3.2 Session
- 定义:Session是服务器端保存的用户会话信息,用于跟踪用户在服务器上的活动。
- 存储位置:存储在服务器端,Session ID通过Cookie或URL参数传递给客户端。
- 生命周期:通常与用户会话相关,浏览器关闭或Session超时后失效。可以通过配置文件调整Session超时时间。
- 用途:
- 保存用户会话状态和身份信息。
- 在服务器端维护用户数据,适合存储敏感信息。
- 安全性:较高,因为数据存储在服务器端。需要防止Session劫持,可以通过使用HTTPS、设置Cookie的
HttpOnly和Secure标志、以及使用CSRF令牌来增强安全性。 - 大小限制:由服务器内存决定,通常不受严格限制。
3.3 Token
- 定义:Token是一种加密字符串,用于用户身份验证和授权。常见类型包括JWT(JSON Web Token)。
- 存储位置:可以存储在客户端的Local Storage、Session Storage或Cookie中。
- 生命周期:由服务器生成时设置,可以是短期或长期有效。通常有明确的过期时间(
exp)。 - 用途:
- 无状态身份验证,尤其适合分布式系统和微服务架构。
- 通过传递Token进行API访问控制。
- 安全性:需要保护Token的安全,避免泄露。可以通过HTTPS传输、Token加密、短有效期、以及使用刷新Token(Refresh Token)来增强安全性。
- 大小限制:通常比Cookie大,但具体限制取决于Token类型和存储位置。
3.4 总结
- Cookie:客户端存储小数据,适合保存非敏感信息和用户偏好设置。
- Session:服务器端存储用户会话信息,适合保存敏感数据和身份信息。
- Token:无状态身份验证,适合分布式系统,便于跨域和跨平台使用。
面试-springMVC
https://baijianglai.cn/面试-springMVC/504245c6cebd/