SpringBoot中使用自定义拦截器
一、新建一个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的使用进行讲解。