模拟场景:一个网站有登录界面、后台界面,但是用户不登录就可以通过URL访问后台页面(我们是想让用户登录后才能访问后台页面),这样子我们就可以通过拦截器来实现对未登录用户的拦截。
拦截器准备
先自定义一个拦截器类,实现HandlerInterceptor
接口;
(该接口有三个方法作用分别是、请求controller前处理,请求controller后处理、veiw视图渲染后处理)
//拦截没有登录就直接访问后台页面的用户
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override//重写请求controller前处理的方法
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object username = request.getSession().getAttribute("username");
if (username!=null){
//已登录用户放行
return true;
}
//非登录用户拦截
request.setAttribute("message","无权限访问!");
return false;
}
}
两种配置自定义拦截器的方法
必要条件: 自定义一个WebMvc配置类,实现 WebMvcConfigurer
接口:
第一种(推荐用法方式):
// WebMvc的配置类
@Configuration
public class MyMcvConfig implements WebMvcConfigurer {
@Override //将我们自定义的拦截器添加进来
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(
//添加自定义的拦截器进来
new LoginHandlerInterceptor())
//拦截指定的URL
.addPathPatterns("/login");
}
@Override//我们可以重写 addViewControllers 方法对URL的请求转发
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("login");
registry.addViewController("/index").setViewName("login");
registry.addViewController("/main.html").setViewName("dashboard");
}
}
第二种(不推荐方式、2.x版本后官方已经不推荐使用了):
// WebMvc的配置类
@Configuration
public class MyMcvConfig implements WebMvcConfigurer {
@Bean//注册到容器中
public WebMvcConfigurerAdapter MyWebMvcConfigurerAdapter(){
WebMvcConfigurerAdapter Adapter = new WebMvcConfigurerAdapter(){
@Override //将我们自定义的拦截器添加进来
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(
//添加自定义的拦截器进来
new LoginHandlerInterceptor())
//拦截指定的URL
.addPathPatterns("/login");
}
@Override//我们可以重写 addViewControllers 方法对URL的请求转发
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("login");
registry.addViewController("/index").setViewName("login");
registry.addViewController("/main.html").setViewName("dashboard");
}
};
return Adapter;
}
}