通过springboot拦截器实现博客文章的自定义URL地址

最近写博客,看见博客系统可以自定义文章的路径。很好奇这个是如何实现的,就想着自己来实现一下。

实现思路

1 既然是自定义的url地址,那么肯定要保存到数据库。
2 拦截所有的请求,然后判断请求的地址是不是一个博文的自定义url地址。
3 如果是就重定向或者转发到博文统一展示页(重定向或者转发时将博文的ID传过去)。
4 博文统一展示页就通过博文的id就可以展示文章内容了。

拦截器学习

既然是通过拦截器实现,那么就需要知道该在何时拦截,如何在拦截器当中实现重定向跳转等等。

/**
 * @author 海加尔金鹰 www.hjljy.cn
 **/
public class MlogPathInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
      
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

springboot当中实现拦截器非常简单,自需要实现HandlerInterceptor这个类就可以。
主要是他的三个方法:

preHandle方法
范围:所有的请求都会进入这个请求 包括静态资源的请求
若返回false,则中断执行,不会进入后续的方法
执行顺序:按照声明的顺序一个接一个执行(重点)

postHandle
调用前提:preHandle返回true
调用时间:请求在进入到Controller方法后,并且Controller方法处理完之后,DispatcherServlet进行视图的渲染之前。post、get方法都能处理
执行顺序:按照声明的顺序倒着执行。(重点)

afterCompletion:
调用时间:DispatcherServlet进行视图的渲染之后
执行顺序:按照声明的顺序倒着执行。

关于执行顺序看这篇文章:https://www.cnblogs.com/pypua/p/10075259.html

最终实现功能的拦截器代码

拦截器代码

/**
 * @author 海加尔金鹰 www.hjljy.cn
 **/
public class MlogPathInterceptor implements HandlerInterceptor {

    @Autowired
    IMlogArticlesService mlogArticlesService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取所有文章的URL
        List<String> allUrl = mlogArticlesService.getAllUrl();
        //获取请求的路径
        String servletPath = request.getServletPath();
        //如果包含就跳转
        if(allUrl.contains(servletPath)){
            //将本次请求转发到  /details/{id}  这个请求路径上
            request.getRequestDispatcher("/details/123").forward(request,response);
            return false;
        }
        return true;
    }
}

添加所有请求的拦截器

@Configuration
public class MlogWebConfig implements WebMvcConfigurer {

    @Bean
    MlogPathInterceptor getMlogPathInterceptor() {
        return new MlogPathInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(getMlogPathInterceptor()).addPathPatterns("/**");
        
    }
}

文章统一展示页处理

  @GetMapping("/details/{id}")
    public String details(@PathVariable int id) {
		//todo  
        return "details?id="+id;
    }

到此,功能就实现了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值