一、新建一个SpringBoot工程,目录结构如下:
二、在核心配置文件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:
<!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>
logout.html:
<!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>
userInfo.html:
<!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>
七、测试方法:通过测试访问各个页面,查看控制台是否打印出“验证登录认证,并遵守拦截器规则,现在放行”这段文字,判断自定义的拦截器是否进行了验证拦截器规则,如果打印该句话,证明拦截器起作用了,验证拦截器规则;如果没有打印,那么说明拦截器没有对该访问路径进行拦截器规则验证,直接放行了。
八、运行程序,结果为:
访问http://127.0.0.1:8080/winson/login:
结果:控制台没有打印这句话:“验证登录认证,并遵守拦截器规则,现在放行”。
访问http://127.0.0.1:8080/winson/logout:
结果:控制台没有打印这句话:“验证登录认证,并遵守拦截器规则,现在放行”。
访问:http://127.0.0.1:8080/winson/userInfo
结果:控制台打印了这句话:“验证登录认证,并遵守拦截器规则,现在放行”。
控制台打印结果:
总结:
一、通过访问页面,控制台是否打印信息,简单的验证拦截器是否拦截请求。
二、请求是在进入到controller之前进行拦截认证的。
三、拦截认证规则可以自定义,我这里没有进行逻辑编写,只是向控制台打印信息,来判断拦截器的拦截是否起作用。
四、实际开发中,使用shio或者Spring Security来对登录认证,权限管理进行开发,都是框架,不用自定义拦截器这种low的方法,但是他们的原理都是使用拦截器,故我这里简单介绍一下拦截器的工作原理和流程,以后有时间,我会将Spring Security的使用进行讲解。
代码地址:https://gitee.com/top_one/springboot-interceptor.git