首先先写个配置类,然后把拦截类 通过Bean的形式注入
package com.xiwi.vip.ziti.common.config; import com.xiwi.vip.ziti.common.interceptor.LoginHandlerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.ArrayList; @Configuration public class IntercepterConfig implements WebMvcConfigurer { @Bean public LoginHandlerInterceptor getLoginHandlerInterceptor() { return new LoginHandlerInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(getLoginHandlerInterceptor()) .excludePathPatterns(new ArrayList<String>() {{ add("/admin/oauth/**"); }}) .addPathPatterns("/admin/**"); } }
|
LoginHandlerInterceptor拦截处理器
package com.xiwi.vip.ziti.common.interceptor; import cn.hutool.cache.impl.TimedCache; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import com.xiwi.vip.ziti.common.admin.AdminLoginUser; import com.xiwi.vip.ziti.common.core.RedisUtil; import com.xiwi.vip.ziti.common.core.ResultJson; import com.xiwi.vip.ziti.common.exception.ApplicationRunTimeException; import com.xiwi.vip.ziti.entity.AdminUser; import com.xiwi.vip.ziti.service.AdminRoleService; import com.xiwi.vip.ziti.service.AdminUserService; import lombok.extern.slf4j.Slf4j; import org.springframework.web.servlet.HandlerInterceptor; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Slf4j public class LoginHandlerInterceptor implements HandlerInterceptor { @Resource private TimedCache<String, Object> timedCache; @Resource private RedisUtil redisUtil; @Resource private AdminUserService adminUserService; @Resource private AdminRoleService adminRoleService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { String token = request.getHeader("admin-auth"); log.info(token); if (StrUtil.isBlankIfStr(token)) { throw new ApplicationRunTimeException(ResultJson.response(-1000, "未登录")); } if (ObjectUtil.hasNull(redisUtil.get(token))) { throw new ApplicationRunTimeException(ResultJson.response(-1000, "未登录")); } JSONObject adminUserJson = redisUtil.get(token, JSONObject.class); AdminUser adminUser = adminUserService.lambdaQuery() .eq(AdminUser::getId, adminUserJson.getStr("admin_id")) .one(); System.out.println( "login:" + adminUser.toString() ); adminUser.setPassword(""); AdminLoginUser.setAdminLoginUser(adminUser, adminRoleService.getAuthIdsByRoleId(adminUser.getRoleId())); redisUtil.set(token, AdminLoginUser.getAdminLoginUser(), 86400); return true; } }
|
Q:为什么要通过Bean的形式引入,我直接new进去不可以吗?
直接new进去也可以 registry.addInterceptor(new LoginHandlerInterceptor()) 但拦截器里面有用到其它ioc容器上其它的Bean。
直接new进去没办法取到其它bean 这个是Spring的Bean加载流程问题
如果你拦截器中没有用到其它Spring管理的Bean 自己在拦截器中new类也是可以的