zoukankan      html  css  js  c++  java
  • SpringBoot拦截器中使用RedisTemplate

    SpringBoot拦截器中使用RedisTemplate

    最近在做项目的过程中需要在拦截器中注入RedisTemplate对象,结果发现一只空指针。

    拦截器代码如下:

    package com.moti.component;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * @Description 登录拦截器:用于登录检查,权限控制
     * @Author xw
     * @Date 15:09 2020/2/26
     * @Param  * @param null
     * @return
     **/
    public class LoginHandlerInterceptor implements HandlerInterceptor {
    
      	@Autowired
        private RedisTemplate redisTemplate;
      
        /**
         * 在目标方式执行之前执行
         * @param request
         * @param response
         * @param handler
         * @return
         * @throws Exception
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            Object loginUser = request.getSession().getAttribute("loginUser");
            if (loginUser==null){
                //未登录,返回登录页面
                response.sendRedirect("/u-cloud/");
                return false;
            }else {
                //已登录,放行
                return true;
            }
        }
    }
    
    

    仔细一想,拦截器在SpringContext初始化之前就执行了,Bean初始化之前它就执行了,所以它肯定是无法获取SpringIOC容器中的内容的。那么我们就让拦截器执行的时候实例化拦截器Bean,在拦截器配置类里面先实例化拦截器,然后再获取就能解决这个问题啦。

    package com.moti.config;
    
    import com.moti.component.LoginHandlerInterceptor;
    import org.springframework.boot.web.server.ErrorPage;
    import org.springframework.boot.web.server.ErrorPageRegistrar;
    import org.springframework.boot.web.server.ErrorPageRegistry;
    import org.springframework.boot.web.servlet.MultipartConfigFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.HttpStatus;
    import org.springframework.util.unit.DataSize;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    import javax.servlet.MultipartConfigElement;
    
    @Configuration
    public class MvcConfig implements WebMvcConfigurer, ErrorPageRegistrar {
        @Bean
        public MultipartConfigElement multipartConfigElement() {
            MultipartConfigFactory factory = new MultipartConfigFactory();
            //文件最大
            factory.setMaxFileSize(DataSize.parse("1024000KB"));
            /// 设置总上传数据总大小
            factory.setMaxRequestSize(DataSize.parse("1024000KB"));
            return factory.createMultipartConfig();
        }
    
        /**
         * @Description 注册视图控制器
         * @Author xw
         * @Date 15:11 2020/2/26
         * @Param [registry]
         * @return void
         **/
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/").setViewName("index");
            registry.addViewController("/temp-file").setViewName("temp-file");
            registry.addViewController("/error400Page").setViewName("error/400");
            registry.addViewController("/error401Page").setViewName("error/401");
            registry.addViewController("/error404Page").setViewName("error/404");
            registry.addViewController("/error500Page").setViewName("error/500");
        }
    
        /**
         * 提前new出 防止redis失效
         * @return
         */
        @Bean
        public LoginHandlerInterceptor getLoginHandlerInterceptor(){
            return new LoginHandlerInterceptor();
        }
    
        /**
         * @Description  注册登录拦截器 addPathPatterns() -> 拦截的请求  excludePathPatterns -> 不拦截的请求
         * @Author xw
         * @Date 15:10 2020/2/26
         * @Param [registry]
         * @return void
         **/
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(getLoginHandlerInterceptor()).addPathPatterns("/**")
                    .excludePathPatterns(
                            "/","/temp-file","/error400Page","/error401Page","/error404Page","/error500Page","/uploadTempFile","/admin","/sendCode","/loginByQQ","/login","/register","/file/share","/connection",
                            "/asserts/**","/**/*.css", "/**/*.js", "/**/*.png ", "/**/*.jpg"
                            ,"/**/*.jpeg","/**/*.gif", "/**/fonts/*", "/**/*.svg");
        }
        
        /**
         * @Description 配置错误页面
         * @Author xw
         * @Date 13:27 2020/3/11
         * @Param [registry]
         * @return void
         **/
        @Override
        public void registerErrorPages(ErrorPageRegistry registry) {
            ErrorPage error400Page = new ErrorPage(HttpStatus.BAD_REQUEST, "/error400Page");
            ErrorPage error401Page = new ErrorPage(HttpStatus.UNAUTHORIZED, "/error401Page");
            ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/error404Page");
            ErrorPage error500Page = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error500Page");
            registry.addErrorPages(error400Page,error401Page,error404Page,error500Page);
        }
    }
    
    

    最主要的就是加入这段代码,并且添加拦截器的时候使用这个方法 而不是new拦截器

        /**
         * 提前new出 防止redis失效
         * @return
         */
        @Bean
        public LoginHandlerInterceptor getLoginHandlerInterceptor(){
            return new LoginHandlerInterceptor();
        }
    
  • 相关阅读:
    Changing Icon File Of Push Button At Runtime In Oracle Forms 6i
    Set Font Properties On Mouse Hover Of Push Button And Text Items At Run time In Oracle Forms
    Change An Item Property Using Set_Item_Property In Oracle Forms
    Calling / Running a report in Oracle forms 10g / 11g
    Change Or Set Report Object Property At Run Time In Oracle Forms Using Set_Report_Object_Property Command
    Refresh / Updating a form screen in Oracle D2k Forms 6i
    Know How And When To Use System.Message_Level To Control Messages In Oracle Forms
    Perform Cut Copy Paste Operations Using Cut_Region Copy_Region Paste_Region Commands In Oracle Forms
    CHECKBOX_CHECKED built-in in Oracle D2k Forms
    Limiting To Select Only 5 Check Boxes Out Of Ten In Oracle Forms
  • 原文地址:https://www.cnblogs.com/zhangruifeng/p/13276224.html
Copyright © 2011-2022 走看看