SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet。
DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller来处理。
SpringMVC的拦截器HandlerInterceptor接口对应提供了三个preHandle,postHandle,afterCompletion方法。preHandle在业务处理器处理请求之前被调用,
postHandle在业务处理器处理请求执行完成后,生成视图之前执行,afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。
在SpringBoot中使用拦截器首先需要实现HandlerInterceptor接口,然后将拦截器注册到MVC中,由MVC根据请求来执行不同的拦截器。
第一步:创建拦截器
package com.bjqdl.wzy.web.interceptors; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import com.bjqdl.wzy.core.ThreadLocalMap; import com.bjqdl.wzy.core.UserContext; import com.bjqdl.wzy.util.AssertUtil; import com.bjqdl.wzy.util.json.JSONUtil; import com.bjqdl.wzy.web.entity.User; import com.bjqdl.wzy.web.service.UserInfoService; import com.bjqdl.wzy.web.utils.HttpUtils; public class UserInfoInterceptor implements HandlerInterceptor{ private static final Logger logger = LoggerFactory.getLogger(UserInfoInterceptor.class); private UserInfoService userInfoService; public UserInfoInterceptor(UserInfoService userInfoService) { super(); this.userInfoService = userInfoService; } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.debug("UserInfoInterceptor.preHandle"); String openid = request.getParameter("openid"); if (request.getRequestURL().toString().contains("/user/")){ logger.debug("注册用户!"); return true; } if (!AssertUtil.isVal(openid)) { logger.error("用户信息不完整,请在url后追加用户信息 url?openid=xxxx"); return false; } if (openid.equals(UserContext.getOpenID())) { return true; } ThreadLocalMap.reset(); User user = this.userInfoService.getUser(openid); if (AssertUtil.isVal(user)) { ThreadLocalMap.put(UserContext.USER_CONTEXT, JSONUtil.parseJSON(user)); ThreadLocalMap.put(UserContext.USER_CONTEXT_IP, HttpUtils.getIpAddress(request)); return true; } else { return false; } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
第二步:注册到MVC中
自定义MVCConfig类,继承WebMvcConfigurerAdapter类,重现public void addInterceptors(InterceptorRegistry registry)方法,具体实现见代码
package com.bjqdl.wzy.web.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import com.bjqdl.wzy.web.interceptors.UserInfoInterceptor; import com.bjqdl.wzy.web.service.UserInfoService; @Configuration public class MVCConfig extends WebMvcConfigurerAdapter { @Autowired private UserInfoService userInfoService; /* (non-Javadoc) * @see org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter#addInterceptors(org.springframework.web.servlet.config.annotation.InterceptorRegistry) */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new UserInfoInterceptor(userInfoService)).addPathPatterns("/**"); super.addInterceptors(registry); } }
注意:
1、注解@Configuration是必备的;
2、addPathPatterns("/**");方法用于通知过滤器针对那些url进行拦截
相关推荐
SpringBoot 自定义拦截器 的 源代码 SpringBoot 自定义拦截器 一、自定义拦截器 二、编写控制器 三、添加拦截器对象,注入到容器的配置类中 另一种写法 四、最后application运行 我们对拦截器并不陌生,无论是 ...
本示例中,我们看到的是一个自定义的Spring Boot Filter用于实现SSO(Single Sign-On)资源拦截的控制,旨在优化资源访问的安全性和效率。 首先,让我们深入了解什么是SSO。SSO是一种身份验证机制,允许用户在一个...
1. 创建自定义拦截器类:你需要创建一个实现了`HandlerInterceptor`接口的类,这个接口包含三个方法:`preHandle()`, `postHandle()`, 和 `afterCompletion()`。这些方法会在请求生命周期的不同阶段被调用。 ```...
本篇将详细讲解如何在Spring Boot中创建并使用自定义拦截器,并提供相关的示例代码。 首先,我们需要了解Spring MVC中的拦截器(HandlerInterceptor)接口。该接口定义了三个方法: 1. `preHandle...
自定义拦截器在CXF中扮演着重要角色,它们允许我们在服务调用前后执行额外的逻辑,如日志记录、安全检查、性能监控等。这通过实现CXF提供的接口或继承特定的类来实现。以下是一些关键知识点: 1. **CXF拦截器基础**...
本主题将深入探讨如何在Spring Boot工程中通过自定义response注解、利用Java反射机制、设置自定义拦截器以及实现WebMvcConfigurer接口来实现这一目标。 首先,我们来看自定义response注解。在Spring Boot中,可以...
首先,创建自定义拦截器类并实现`HandlerInterceptor`接口是实现拦截器功能的第一步。如示例代码所示,我们需要创建一个名为`ErrorInterceptor`的类,并在其中实现`preHandle`和`postHandle`方法。这两个方法都是在...
本文将深入探讨如何为CXF服务器端添加自定义拦截器以执行这样的权限验证。 首先,理解CXF(CXF: Apache CXF - A Next Generation JAXWS and JAX-RS API Implementation)是一个开源的Java框架,它用于创建和部署...
拦截器的使用为开发人员提供了灵活的请求处理方式,可以方便地在请求到达控制器之前和之后加入自定义的逻辑。掌握拦截器的使用,对于开发安全、高效、易于维护的Web应用是非常有帮助的。在实际开发中,合理设计拦截...
在Spring Boot应用中,拦截器(Interceptor)是一个强大的工具,用于在请求被处理之前或之后执行自定义逻辑。本文将详细介绍如何在Spring Boot中实现拦截器以进行权限校验和登录验证,通过一个简单的Demo来阐述整个...
在 SpringBoot 框架中,拦截器(Interceptor)可以用来拦截和处理请求。在上面的代码中,我们定义了一个名为 `AuthorizationInterceptor` 的拦截器,该拦截器用来拦截请求,并将用户信息存入 request 作用域中。 ``...
首先,我们需要创建一个自定义的拦截器类,继承HandlerInterceptor接口,并实现其三个方法:afterCompletion、postHandle和preHandle。 afterCompletion方法在请求处理完成之后被调用,主要用于释放资源和记录日志...
在Spring Boot应用中,拦截器(Interceptor)是一个重要的组件,它允许我们在请求处理之前或之后执行自定义逻辑。Spring框架提供了HandlerInterceptor接口,用于实现拦截器功能。在本篇文章中,我们将深入探讨如何在...
SpringBoot添加自定义拦截器的实现代码 Spring Boot是一种基于Java的Web应用程序框架,提供了许多实用的功能和工具来帮助开发者快速构建Web应用程序。其中,拦截器(Interceptor)是一种非常重要的组件,能够在请求...
在SpringBoot中,我们可以通过实现HandlerInterceptor接口创建自定义拦截器。 5. **登录验证**: 登录验证是Web应用中的核心功能,用于确保只有合法用户才能访问受保护的资源。通过过滤器或拦截器,我们可以检查每...
在本项目"SpringBoot拦截器实现+HTTPSdemo"中,我们深入探讨了Spring Boot框架如何通过自定义拦截器实现Web应用程序的高级控制,并且演示了如何配置和启用HTTPS以确保数据传输的安全性。以下是关于这些知识点的详细...
首先,我们需要创建一个自定义的拦截器类,它需要继承Spring MVC的`HandlerInterceptor`接口或者`HandlerInterceptorAdapter`抽象类。`HandlerInterceptor`接口包含三个方法:`preHandle()`、`postHandle()`和`...
在Spring框架中,拦截器(Interceptor)是一种强大的工具,它允许开发者在请求处理前后执行自定义逻辑,例如日志记录、权限检查等。Spring MVC中的拦截器是基于AOP(面向切面编程)原理实现的,可以理解为对...
自定义拦截器需要继承Spring MVC提供的`HandlerInterceptor`接口,并实现其三个方法:`preHandle`、`postHandle`和`afterCompletion`。在`MyInterceptor`类中,我们可以看到`networkProxyInfoService`被声明为`@...
- **配置拦截器**:在`WebMvcConfigurer`的实现类中,通过`addInterceptors`方法添加自定义的拦截器,定义拦截的URL规则和处理逻辑。 - **拦截器的执行流程**:拦截器会在Controller方法执行前后进行回调,可以...