面试-springMVC

1. SpringMVC执行流程

1.1 视图阶段(JSP)

image-20240625160225356

  • 用户发送出请求到前端控制器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 前后端分离阶段(接口)

image-20240625160316088

  • 用户发送出请求到前端控制器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
      26
      import 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
      25
      import 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
      11
      import 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的区别

  1. 定义:Cookie是由服务器生成并发送给客户端的小数据文件,保存在客户端浏览器中。
  2. 存储位置:存储在客户端浏览器中。
  3. 生命周期:可以设置有效期,默认为会话期间(浏览器关闭后失效)。也可以设置长时间有效的持久化Cookie。
  4. 用途:
    • 保存用户偏好设置和登录状态。
    • 跟踪用户会话。
  5. 安全性:不适合存储敏感信息,容易受到XSS攻击。可以通过设置HttpOnlySecure标志增加安全性。
  6. 大小限制:每个Cookie大小限制为4KB。

3.2 Session

  1. 定义:Session是服务器端保存的用户会话信息,用于跟踪用户在服务器上的活动。
  2. 存储位置:存储在服务器端,Session ID通过Cookie或URL参数传递给客户端。
  3. 生命周期:通常与用户会话相关,浏览器关闭或Session超时后失效。可以通过配置文件调整Session超时时间。
  4. 用途:
    • 保存用户会话状态和身份信息。
    • 在服务器端维护用户数据,适合存储敏感信息。
  5. 安全性:较高,因为数据存储在服务器端。需要防止Session劫持,可以通过使用HTTPS、设置Cookie的HttpOnlySecure标志、以及使用CSRF令牌来增强安全性。
  6. 大小限制:由服务器内存决定,通常不受严格限制。

3.3 Token

  1. 定义:Token是一种加密字符串,用于用户身份验证和授权。常见类型包括JWT(JSON Web Token)。
  2. 存储位置:可以存储在客户端的Local Storage、Session Storage或Cookie中。
  3. 生命周期:由服务器生成时设置,可以是短期或长期有效。通常有明确的过期时间(exp)。
  4. 用途:
    • 无状态身份验证,尤其适合分布式系统和微服务架构。
    • 通过传递Token进行API访问控制。
  5. 安全性:需要保护Token的安全,避免泄露。可以通过HTTPS传输、Token加密、短有效期、以及使用刷新Token(Refresh Token)来增强安全性。
  6. 大小限制:通常比Cookie大,但具体限制取决于Token类型和存储位置。

3.4 总结

  • Cookie:客户端存储小数据,适合保存非敏感信息和用户偏好设置。
  • Session:服务器端存储用户会话信息,适合保存敏感数据和身份信息。
  • Token:无状态身份验证,适合分布式系统,便于跨域和跨平台使用。

面试-springMVC
https://baijianglai.cn/面试-springMVC/504245c6cebd/
作者
Lai Baijiang
发布于
2024年5月10日
许可协议