SpringMVC拦截器常见应用场景

在Spring MVC中,拦截器是通过实现HandlerInterceptor接口来定义的。该接口包含了三个方法:

  • preHandle:在请求到达处理器之前执行,可以进行一些预处理操作。如果返回false,则请求将被拦截,不再继续执行后续的拦截器和处理器。

  • postHandle:在处理器执行之后、视图渲染之前执行,可以进行一些后处理操作。可以修改ModelAndView对象,添加额外的模型数据或修改视图。

  • afterCompletion:在视图渲染之后执行,用于进行一些资源清理操作,例如释放资源或记录日志。

下面来看一下常见的应用场景

1.认证和授权:拦截器可以用于验证用户的身份和权限,确保只有经过认证和授权的用户才能访问受保护的资源。

public class AuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 检查用户是否已经登录,如果未登录则重定向到登录页面
        if (!isLoggedIn(request)) {
            response.sendRedirect("/login");
            return false;
        }
        
        // 检查用户是否有访问权限,如果没有则返回403 Forbidden错误
        if (!hasAccess(request)) {
            response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");
            return false;
        }
        
        return true;
    }
    
    // 检查用户是否已经登录
    private boolean isLoggedIn(HttpServletRequest request) {
        // 实现具体的登录检查逻辑
        // 返回true表示已登录,返回false表示未登录
    }
    
    // 检查用户是否有访问权限
    private boolean hasAccess(HttpServletRequest request) {
        // 实现具体的权限检查逻辑
        // 返回true表示有权限,返回false表示无权限
    }
}

2.日志记录:拦截器可以用于记录请求和响应的日志,以便进行故障排除、性能分析和审计等。

public class LoggingInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 记录请求的URL和时间
        String url = request.getRequestURL().toString();
        String timestamp = LocalDateTime.now().toString();
        System.out.println("Request received - URL: " + url + ", Timestamp: " + timestamp);
        
        return true;
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 记录请求的响应状态码
        int statusCode = response.getStatus();
        System.out.println("Request completed - Status Code: " + statusCode);
    }
}

3.参数校验和数据转换:拦截器可以在请求到达处理器之前对请求参数进行校验和转换,以确保数据的有效性和一致性。

public class ValidationInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 校验请求参数是否有效,如果无效则返回400 Bad Request错误
        if (!isValid(request)) {
            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid Request");
            return false;
        }
        
        // 对请求参数进行数据转换,确保数据的一致性和有效性
        convertData(request);
        
        return true;
    }
    
    // 校验请求参数是否有效
    private boolean isValid(HttpServletRequest request) {
        // 实现具体的参数校验逻辑
        // 返回true表示参数有效,返回false表示参数无效
    }
    
    // 对请求参数进行数据转换
    private void convertData(HttpServletRequest request) {
        // 实现具体的数据转换逻辑
    }
}

你可能感兴趣的:(spring,java,后端)