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();
        }
    
  • 相关阅读:
    TCP建立连接和断开连接
    城市三级联动Springmvc+mysql
    JS页面间数据传递的各种方法
    点击Button弹出登陆注册框
    一个多表联合查询引发的思考
    Linq扩展方法获取单个元素
    Visual Studio 常见问题
    格式化asp.net mvc视图页面
    2014上半年度挑战回顾
    2014年上半度年度挑战
  • 原文地址:https://www.cnblogs.com/zhangruifeng/p/13276224.html
Copyright © 2011-2022 走看看