前言
mvc这一块的功能有点啰嗦了,写起来如果只是配置的话,其实很简单,还是贴出来官方文档地址,后面就不会的单独说这块的内容了。
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-config
实现
第一种实现是基于https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-config-interceptors这一块的内容如下。实际根据项目调整即可,没什么额外好说的。
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LocaleChangeInterceptor());
registry.addInterceptor(new ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*");
}
}
第二种实现方式比较简单,但是没有第一种灵活。第一种可以指定拦截地址以及排除的地址,第二种实现很简单,但是全局拦截。
直接继承org.springframework.web.servlet.handler.HandlerInterceptorAdapter
, 然后把实现类加入到Spring
容器中即可,一个简单的例子如下, 比如我们的认证拦截器就可以在这里进行处理,然后将用户信息放入到上下文中,在处理结束的时候再移除。
@Slf4j
@Component
public class JwtAuthorizationTokenFilter extends HandlerInterceptorAdapter {
/**
* 前置校验
*
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 塞入最新用户数据
UserContextUtil.setUserClaim(storeUserClaim);
MDC.put(USER_ID, storeUserClaim.getUserId());
}
/**
* 执行器结束
*
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable
Exception ex) throws Exception {
// 移除用户信息
UserContextUtil.removeUserClaim();
MDC.remove(USER_ID);
}
}
项目实现
当然在实际项目中,会有更加复杂的实现,也会更接近实用性。
这里有一个比较复杂的例子,是结合整个jwt和拦截器做认证拦截和用户信息处理的,后续会更新文档。
https://github.com/dongfangding/ddf-common/blob/dev/ddf-common-jwt/src/main/java/com/ddf/boot/common/jwt/filter/JwtAuthorizationTokenFilter.java