Spring Boot 拦截器之验证登录

添加jar包,这个jar包不是必须的,只是在拦截器里用到了,如果不用的话,完全可以不引入

[java]  view plain  copy
  1. <dependency>  
  2.             <groupId>org.apache.commons</groupId>  
  3.             <artifactId>commons-lang3</artifactId>  
  4.             <version>3.5</version>  
  5.         </dependency>  

springboot默认为Tomcat,如果用jetty,还需要引入

[java]  view plain  copy
  1. <dependency>  
  2.             <groupId>javax.servlet</groupId>  
  3.             <artifactId>javax.servlet-api</artifactId>  
  4.             <version>3.1.0</version>  
  5.         </dependency>  

1、以登录验证为例,首先创建个@Auth注解

[java]  view plain  copy
  1. package com.demo.interceptor;  
  2.   
  3. import java.lang.annotation.*;  
  4.   
  5. /** 
  6.  * 在类或方法上添加@Auth就验证登录 
  7.  */  
  8. @Target({ElementType.TYPE, ElementType.METHOD})  
  9. @Retention(RetentionPolicy.RUNTIME)  
  10. @Documented  
  11. public @interface Auth {  
  12. }  
2、创建一个Constants,在拦截器里用

[java]  view plain  copy
  1. package com.demo.util;  
  2.   
  3.  
  4. public interface Constants {  
  5.     int MAX_FILE_UPLOAD_SIZE = 5242880;  
  6.     String MOBILE_NUMBER_SESSION_KEY = "sessionMobileNumber";  
  7.     String USER_CODE_SESSION_KEY = "userCode";  
  8.     String SESSION_KEY = "sessionId";  
  9. }  

3、创建一个SessionData,用于保存在session中的字段


[java]  view plain  copy
  1. package com.demo.model;  
  2.   
  3. import lombok.Data;  

  4. @Data  
  5. public class SessionData {  
  6.     private Integer userCode;  
  7.     private String mobileNumber;  
  8. }  



4、实现登录拦截实现

[java]  view plain  copy
  1. package com.demo.interceptor;  
  2.   
  3. import com.demo.model.SessionData;  
  4. import com.demo.util.RedisUtil;  
  5. import org.springframework.beans.factory.annotation.Autowired;  
  6. import org.springframework.stereotype.Component;  
  7. import org.springframework.web.method.HandlerMethod;  
  8. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;  
  9.   
  10. import javax.servlet.http.HttpServletRequest;  
  11. import javax.servlet.http.HttpServletResponse;  
  12. import java.lang.reflect.Method;  
  13.   
  14. import static com.demo.util.Constants.MOBILE_NUMBER_SESSION_KEY;  
  15. import static com.demo.util.Constants.SESSION_KEY;  
  16. import static com.demo.util.Constants.USER_CODE_SESSION_KEY;  
  17.   

  18. @Component  
  19. public class LoginInterceptor extends HandlerInterceptorAdapter {  
  20.     @Autowired  
  21.     private RedisUtil redisUtils;  
  22.     private final static String SESSION_KEY_PREFIX = "session:";  
  23.     public boolean preHandle(HttpServletRequest request,  
  24.                              HttpServletResponse response, Object handler) throws Exception {  
  25.         if (!handler.getClass().isAssignableFrom(HandlerMethod.class)) {  
  26.             return true;  
  27.         }  
  28.         handlerSession(request);  
  29.   
  30.         final HandlerMethod handlerMethod = (HandlerMethod) handler;  
  31.         final Method method = handlerMethod.getMethod();  
  32.         final Class<?> clazz = method.getDeclaringClass();  
  33.         if (clazz.isAnnotationPresent(Auth.class) ||  
  34.                 method.isAnnotationPresent(Auth.class)) {  
  35.             if(request.getAttribute(USER_CODE_SESSION_KEY) == null){  
  36.     
  37.                  throw new Exception();  
  38.                  
  39.             }else{  
  40.                 return true;  
  41.             }  
  42.         }  
  43.   
  44.         return true;  
  45.   
  46.     }  
  47.     public void  handlerSession(HttpServletRequest request) {  
  48.         String sessionId = request.getHeader(SESSION_KEY);  
  49.         if(org.apache.commons.lang3.StringUtils.isBlank(sessionId)){  
  50.             sessionId=(String) request.getSession().getAttribute(SESSION_KEY);  
  51.         }  
  52.         if (org.apache.commons.lang3.StringUtils.isNotBlank(sessionId)) {  
  53.             SessionData model = (SessionData) redisUtils.get(SESSION_KEY_PREFIX+sessionId);  
  54.             if (model == null) {  
  55.                 return ;  
  56.             }  
  57.             request.setAttribute(SESSION_KEY,sessionId);  
  58.             Integer userCode = model.getUserCode();  
  59.             if (userCode != null) {  
  60.                 request.setAttribute(USER_CODE_SESSION_KEY, Long.valueOf(userCode));  
  61.             }  
  62.             String mobile = model.getMobileNumber();  
  63.             if (mobile != null) {  
  64.                 request.setAttribute(MOBILE_NUMBER_SESSION_KEY, mobile);  
  65.             }  
  66.         }  
  67.         return ;  
  68.     }  
  69. }  

5、配置拦截器

[java]  view plain  copy
  1. package com.demo.interceptor;  
  2.   
  3. import org.hibernate.validator.HibernateValidator;  
  4. import org.slf4j.Logger;  
  5. import org.slf4j.LoggerFactory;  
  6. import org.springframework.beans.factory.annotation.Autowired;  
  7. import org.springframework.context.MessageSource;  
  8. import org.springframework.context.annotation.Bean;  
  9. import org.springframework.context.annotation.ComponentScan;  
  10. import org.springframework.context.annotation.Configuration;  
  11. import org.springframework.context.annotation.PropertySource;  
  12. import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;  
  13. import org.springframework.context.support.ReloadableResourceBundleMessageSource;  
  14. import org.springframework.validation.Validator;  
  15. import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;  
  16. import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;  
  17. import org.springframework.web.servlet.ViewResolver;  
  18. import org.springframework.web.servlet.config.annotation.*;  
  19. import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;  
  20. import org.springframework.web.servlet.view.InternalResourceViewResolver;  
  21.   

  22. @Configuration  
  23. @EnableWebMvc  
  24. @ComponentScan(basePackages = "com.demo.controller")  
  25. @PropertySource(value = "classpath:application.properties",  
  26.         ignoreResourceNotFound = true,encoding = "UTF-8")  
  27. public class MvcConfig extends WebMvcConfigurerAdapter {  
  28.     private static final Logger logger = LoggerFactory.getLogger(MvcConfig.class);  
  29.     @Autowired  
  30.     LoginInterceptor loginInterceptor;  
  31.   
  32.     /** 
  33.  
  34.      * <p> 
  35.      *     视图处理器 
  36.      * </p> 
  37.      * 
  38.      * @return 
  39.      */  
  40.     @Bean  
  41.     public ViewResolver viewResolver() {  
  42.         logger.info("ViewResolver");  
  43.         InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();  
  44.         viewResolver.setPrefix("/WEB-INF/jsp/");  
  45.         viewResolver.setSuffix(".jsp");  
  46.         return viewResolver;  
  47.     }  
  48.   
  49.     /** 
  50.      * 拦截器配置 
  51.      * @param registry 
  52.      */  
  53.     @Override  
  54.     public void addInterceptors(InterceptorRegistry registry) {  
  55.         // 注册监控拦截器,解决@Autowired注入失败(配置在Spring 之前加载) 
  56.         registry.addInterceptor(loginInterceptor)  
  57.                 .addPathPatterns("/**")  
  58.          .excludePathPatterns("/configuration/ui");  
  59.   
  60.     }  
  61.   
  62.     @Override  
  63.     public void addCorsMappings(CorsRegistry registry) {  
  64.         registry.addMapping("/**")  
  65.                 .allowedOrigins("*")  
  66.                 .allowedHeaders("*/*")  
  67.                 .allowedMethods("*")  
  68.                 .maxAge(120);  
  69.     }  
  70.   
  71.     /** 
  72.      * 资源处理器 
  73.      * @param registry 
  74.      */  
  75.     @Override  
  76.     public void addResourceHandlers(ResourceHandlerRegistry registry) {  
  77.         logger.info("addResourceHandlers");  
  78.         registry.addResourceHandler("/swagger-ui.html")  
  79.                 .addResourceLocations("classpath:/META-INF/resources/");  
  80.         registry.addResourceHandler("/webjars/**")  
  81.                 .addResourceLocations("classpath:/META-INF/resources/webjars/");  
  82.     }  
  83.   
  84. }  
以上就完成了,测试时可以在LoginInterceptor里打断点,然后在controller上或者方法上添加@Auth注解,

controller上添加以后这个controller里所有请求都验证登录,在方法里添加只有请求这个方法时验证

[java]  view plain  copy
  1. @Auth  
  2. @RestController  
  3. public class TestController {  
  4.   
  5.   
  6. }  
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值