一、新建一个SpringBoot工程,目录结构如下:

spring boot 拦截器 返回指定数据 springboot拦截器跳转自定义页面_spring

二、在核心配置文件application.properties中配置视图解析器格式

#配置视图解析器解析文件的格式
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.html

三、新建一个自定义拦截器类:LoginInteceptor.java,拦截器作用于请求进入到controller之前。

package cn.com.winson.interceptor;

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

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * 自定义登录拦截器
 * 
 * @author lvhao
 * @date 2018年12月8日
 * @time 上午10:14:37
 */
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {

    }

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {

    }
    
    /*在请求进入到controller之前会调用此方法,所以在该方法中编写拦截逻辑*/
    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        System.out.println("验证登录认证,并遵守拦截器规则,现在放行");
        /*这里省略了拦截器的逻辑设计,直接认证通过*/
        /*既然认证通过,返回值就为true,逻辑可以继续往下执行*/
        return true;
    }

}

四、自定义拦截器拦截配置类(拦截规则)LoginInterceptorConfig.java类:该类继承WebMvcConfigurerAdapter适配器,并重写其中的addInterceptors方法,添加一个拦截器及拦截规则。

注意:@Configuration注解的使用。

package cn.com.winson.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import cn.com.winson.interceptor.LoginInterceptor;

/**
 * 自定义的登录拦截器的配置类
 * 
 * @author lvhao
 * @date 2018年12月8日
 * @time 上午10:23:07
 */
/* @Configuration注解:相当于是一个spring的配置文件(applicationContext.xml) */
@Configuration
public class LoginInterceptorConfig extends WebMvcConfigurerAdapter {

    /* 重写WebMvcConfigurerAdapter方法:作用为添加一个拦截器,添加拦截器拦截规则 */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        /*拦截和不拦截的路径参数都可以是数组*/
        String[] excludePathPatterns ={"/winson/login","/winson/logout"};
        registry.addInterceptor(new LoginInterceptor())
                /*表示对以winson开头的请求地址都进行拦截*/
                .addPathPatterns("/winson/**")
                /*表示对以winson开头,后面紧跟着的是login的请求地址,不进行拦截,exclude表示排除*/
                .excludePathPatterns(excludePathPatterns);
        
        /*拦截器可以同时存在好几个,如下,我们再写一个拦截*/
        String[] tomexcludePathPatterns ={"/tom/login","/tom/logout"};
        registry.addInterceptor(new LoginInterceptor())
        /*表示对以winson开头的请求地址都进行拦截*/
        .addPathPatterns("/tom/**")
        /*表示对以winson开头,后面紧跟着的是login的请求地址,不进行拦截,exclude表示排除*/
        .excludePathPatterns(tomexcludePathPatterns);
    }

}

五、新建一个IndexController.java,接收请求:

package cn.com.winson.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class IndexController {
    
    /*登录页*/
    @GetMapping("/winson/login")
    public String login() {
        return "login";
    }
    /*退出页*/
    @GetMapping("/winson/logout")
    public String logout() {
        return "logout";
    }
    /*用户信息列表页*/
    @GetMapping("/winson/userInfo")
    public String userInfo() {
        return "userInfo";
    }

}

六、新建三个页面login.html、logout.html、userInfo.html内容如下:

注意:新建的页面位置为:/src/main/webapp目录下,这是SpringBoot视图解析器寻找视图的默认的位置。

login.html:

spring boot 拦截器 返回指定数据 springboot拦截器跳转自定义页面_拦截器_02

spring boot 拦截器 返回指定数据 springboot拦截器跳转自定义页面_html_03

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <center>
        <h2 style="color: red">登录页</h2>
        <hr>
    </center>
</body>
</html>

View Code

 logout.html:

spring boot 拦截器 返回指定数据 springboot拦截器跳转自定义页面_拦截器_02

spring boot 拦截器 返回指定数据 springboot拦截器跳转自定义页面_html_03

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <center>
        <h1 style="color: green;">退出页</h1>
        <hr>
    </center>
</body>
</html>

View Code

userInfo.html:

spring boot 拦截器 返回指定数据 springboot拦截器跳转自定义页面_拦截器_02

spring boot 拦截器 返回指定数据 springboot拦截器跳转自定义页面_html_03

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <center>
        <hr>
        <h2 style="color: blue">用户列表页</h2>
    </center>
</body>
</html>

View Code

七、测试方法:通过测试访问各个页面,查看控制台是否打印出“验证登录认证,并遵守拦截器规则,现在放行”这段文字,判断自定义的拦截器是否进行了验证拦截器规则,如果打印该句话,证明拦截器起作用了,验证拦截器规则;如果没有打印,那么说明拦截器没有对该访问路径进行拦截器规则验证,直接放行了。

八、运行程序,结果为:

访问http://127.0.0.1:8080/winson/login:

结果:控制台没有打印这句话:“验证登录认证,并遵守拦截器规则,现在放行”。

spring boot 拦截器 返回指定数据 springboot拦截器跳转自定义页面_spring_08

访问http://127.0.0.1:8080/winson/logout:

结果:控制台没有打印这句话:“验证登录认证,并遵守拦截器规则,现在放行”。

spring boot 拦截器 返回指定数据 springboot拦截器跳转自定义页面_html_09

访问:http://127.0.0.1:8080/winson/userInfo

结果:控制台打印了这句话:“验证登录认证,并遵守拦截器规则,现在放行”。

spring boot 拦截器 返回指定数据 springboot拦截器跳转自定义页面_拦截器_10

控制台打印结果:

spring boot 拦截器 返回指定数据 springboot拦截器跳转自定义页面_html_11

总结:

一、通过访问页面,控制台是否打印信息,简单的验证拦截器是否拦截请求。

二、请求是在进入到controller之前进行拦截认证的。

三、拦截认证规则可以自定义,我这里没有进行逻辑编写,只是向控制台打印信息,来判断拦截器的拦截是否起作用。

四、实际开发中,使用shio或者Spring Security来对登录认证,权限管理进行开发,都是框架,不用自定义拦截器这种low的方法,但是他们的原理都是使用拦截器,故我这里简单介绍一下拦截器的工作原理和流程,以后有时间,我会将Spring Security的使用进行讲解。

 

代码地址:https://gitee.com/top_one/springboot-interceptor.git