美文网首页Spring Boot程序员
Springboot里面如何定义拦截器

Springboot里面如何定义拦截器

作者: OnyWang | 来源:发表于2018-01-25 09:06 被阅读102次

一下子转入springboot的怀抱之后,对于之前通过xml进行的一些配置。转成完全基于注解式,可能都有些不习惯吧。此次面对一个这样的需求,计划将公用的基础信息进行查询,可以直接给页面使用。

需求介绍

页面使用的Thymeleaf框架,使用框架的模板,将整体页面布局进行拆分。其中,页面头作为公用的模板引入到了每一个页面。页面里面使用Thymeleaf标签进行后台动态数据的取值。这样做就会产生一个问题:即动态数据变量如何每次都获取到值?

总结到如下两种解决方案:

  1. 使用缓存技术。之前写过一篇springboot和Ehcache集成的文章。springboot整合EHCache,可以参考该文章。但是,这样的话需要每一次都进行缓存的取值,比较繁琐。上次说过,使用springboot的缓存技术去查询,定义拦截器,然后每次都去查询数据库(会自动识别,第一次才会查询数据库,之后不再查询数据库)。但是,无论这种方式如何去优化,总之都要进行缓存的取值。
  2. 使用拦截器拦截,之后存入servlet的attribute。这样的话,公用的Thymeleaf模板直接去servlet下面取值就好了。

相对于第一种方案,第二种比较简洁,不必每次都去查询。可以说是,一次拦截,终身受益。针对于第二种方案,下面重点介绍一下,说一下整体的实现过程。

实现方式

实现思路

实现思路很简单,定义拦截器,拦截我们制定的请求。之后将数据存入request。页面直接从request里面取值。

实现步骤

  • 定义拦截器

这个不必多说,继承HandlerInterceptorAdapter,之后重写preHandle即可。代码如下以供参考:

/**
 * 网站信息拦截器,将网站的基础信息进行拦截
 */
@Component
public class LimitIntercepterForWebsite extends HandlerInterceptorAdapter{
    Logger logger = LoggerFactory.getLogger(LimitIntercepterForWebsite.class);
    @Autowired
    private EduWebsiteProfileService eduWebsiteProfileService;
    @Autowired
    private EduWebsiteNavigateService eduWebsiteNavigateService;
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        super.afterCompletion(request, response, handler, ex);
    }


    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取配置信息
        Map<String,Object> websitemap = eduWebsiteProfileService.getWebsiteProfileByType("web");
        request.setAttribute("websitemap",websitemap);
        Map<String,Object> logomap = eduWebsiteProfileService.getWebsiteProfileByType("logo");
        request.setAttribute("logomap",logomap);
        Map<String, Object> navigateMap =  eduWebsiteNavigateService.getWebNavigate();
        request.setAttribute("navigateList",navigateMap.get("INDEX"));
        return super.preHandle(request, response, handler);
    }
}

注意:上面定义的拦截器,需要注解为component组件

  • 注解配置该拦截器

这里,需要在配置类里面进行拦截器的配置,配置类定义为Configuration,同时继承WebMvcConfigurerAdapter类。重写addInterceptors方法,在该方法里面实现对指定请求的拦截。代码如下以供参考:

 //添加拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //多个拦截器组成一个拦截器链
        // addPathPatterns用于添加拦截规则
        // excludePathPatterns用户排除拦截
//        super.addInterceptors(registry);
        registry.addInterceptor(limitIntercepterForWebsite()).addPathPatterns("/**");
    }

这里对所有的请求实现了拦截

  • 在Thmeleaf框架对于的html页面,进行request变量的取值。

使用内置变量httpServletRequest进行取值即可。代码如下以供参考:

<li th:each="nav:${#httpServletRequest.getAttribute('navigateList')}">
                        <a th:href="${nav.url}" th:title="${nav.name}">
                            <span th:text="${nav.name}"></span>
                        </a>
                    </li>

综上,完成了一个在springboot下面拦截器的实现。

相关文章

网友评论

    本文标题:Springboot里面如何定义拦截器

    本文链接:https://www.haomeiwen.com/subject/uwpmaxtx.html