Spring Boot 拦截器

Spring Boot 拦截器的使用详解


前言

Spring Boot拦截器的使用。Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Spring提供的HandlerInterceptor(拦截器)。


一、拦截器是什么?

先理解一下AOP的概念,AOP不是一种具体的技术,而是一种编程思想。

在面向对象编程的过程中,我们很容易通过继承、多态来解决纵向扩展。

但是对于横向的功能,比如,在所有的service方法中开启事务,或者统一记录日志等功能,面向对象的是无法解决的。所以AOP——面向切面编程其实是面向对象编程思想的一个补充。而我们今天讲的拦截器属于面向切面编程的具体实现。

二、配置拦截器

1.项目结构

在这里插入图片描述

2.创建自定义的拦截器类并实现HandlerInterceptor接口

代码如下(示例):

package com.adu.interceptor.demo.Service;

import com.adu.interceptor.demo.model.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class InterceptorHandlder implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //业务拦截的规则
        //从Seesion中获取该用户是否登录,判断是否登录

        User user = (User) request.getSession().getAttribute("user");
        if(user == null){
            //未登录
            response.sendRedirect(request.getContextPath()+"/Error");


            return false;

        }
        else {    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 {

    }
}

3.在model下面创建实体类User类

package com.adu.interceptor.demo.model;

public class User {
    private  String id;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    private  String username;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}


4.创建UserController控制层类

package com.adu.interceptor.demo.Controller;

import com.adu.interceptor.demo.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;

@Controller
/*
* 我们这里是表示login为模拟登录的页面
* center为模拟登录之后可以看到的页面,未登录之前不能看到该页面,返回时Error页面,需要通过Session取到数据才可以展示center页面
* 也即是我们登录后设置了Session
* out资源类似于游客可以看的页面,就是不登录都可以直接访问的页面
* */
public class UserController {
    @RequestMapping("/login")
    public @ResponseBody
    Object login(HttpSession session) {
        User user = new User();
        user.setId("1000");
        user.setUsername("zhngsan");
        session.setAttribute("user", user);

        return "login Success";
    }

    @RequestMapping("/center")
    public @ResponseBody
    Object center() {
        return "登录之后的资源";

    }

    @RequestMapping("/out")
    public @ResponseBody
    Object out() {

        return "外部资源";
    }

    @RequestMapping("/Error")
    public @ResponseBody Object Error() {


        return "未登录";
    }


}

5. 定义配置类

这里需要重写addInterceptors方法,增加拦截的页面,在这里我们定义拦截的页面为center页面,也就是模拟登录之后可以看到的页面,未登录的话拦截器拦截会直接返回到Error页面上。

package com.adu.interceptor.demo.Interceptor;

import com.adu.interceptor.demo.Service.InterceptorHandlder;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class InterceptorConf implements WebMvcConfigurer {

    //添加自己定义的拦截器,这里相当于在mVC中的拦截器的Xml配置文件中的类容
    //mvc:interceptor
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new InterceptorHandlder()).addPathPatterns("/center").excludePathPatterns();


    }
}

6.网页测试

1.我们直接访问http://localhost:8080/center页面
在这里插入图片描述

  1. 我们先访问http://localhost:8080/login,再次访问http://localhost:8080/center页面
    3.
    在这里插入图片描述

总结

本篇文章主要是简单对Spring Boot 中的拦截器做了一个简单的介绍,后续还有很多的知识,需要我们去多多动手实践。所谓“实践出真知”,多实践一些原理也就慢慢的明白了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值