前面知识点提到了自定义mvc配置,但是我们没有另外导入过mvc的包,因为本身就是spring全家桶里面的东西,spring boot也是完成了内置mvc框架
下面沿用知识点13项目,以一个例子演示mvc拦截器的操作,我们要做的是如果没有的登录,则不允许访问列表页面,注意为了后续的学习想把项目中知识点12的ES相关操作注释掉,不然后面的学习要去开ES服务比较麻烦
第一步:建立拦截器包和拦截器类
package com.wy.scjg.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 登录拦截器
*/
public class LoginInterceptor implements HandlerInterceptor {
/**
* 这个方法触发在请求刚到达后端,处理请求的控制器以及视图解析还未发生作用之前。是我们使用拦截器最常用的一个方法
* 返回false表示,不通过拦截器,同时你应当准备重定向或者准备相关的返回
* 返回true则通过拦截器
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器执行了@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
//获取登录 的信息
Object user = request.getSession().getAttribute("user");
//判断登录信息 是否正常
if(user!=null){
System.out.println("用户已经登录正常执行");
return true;
}else{
System.out.println("用户没有登录,就转发到登录界面");
//转发登录界面
response.sendRedirect("/user/toLogin");
return false;
}
}
/**
* 该方法触发在请求已被控制器处理完毕,返回视图之前,不是很常用,通常是用来完善处理器结果的
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
/**
* 这个方法在控制器视图解析全部完成之后,最后执行,通常用来做一些扫尾工作,基本不用
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
第二步:在知识点12中建立的mvc配置类中注册拦截器
package com.wy.scjg.config;
import com.wy.scjg.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
/**
* 自定义静态资源方法
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//自定义静态资源存放地址
registry.addResourceHandler("/imgs/**")
.addResourceLocations("file:D://imgs//");
}
/**
* 注册拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册拦截器,除了自定义静态资源,所有页面都需要经过此拦截器
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/imgs/**","/user/toLogin","/user/login");
}
}
第三步:在UserController中添加登录控制器,本文做一个伪代码,大家有兴趣可以做全
/**
* 预登陆
* @return
*/
@RequestMapping("/toLogin")
public String toLogin(){
return "user_login";
}
/**
* 正式登录
* @param request
* @param name
* @return
*/
@RequestMapping("/login")
public String login(HttpServletRequest request,String name){
request.getSession().setAttribute("user",name);
//模式时返回一个视图,redirect是返回某个控制器
return "redirect:/user/list";
}
第四步:准备一个登录界面
<html>
<head>
<title>用户登录界面</title>
</head>
<body>
<form action="/user/login" method="post">
用户名:<input type="text" name="name" value="lisi"/>
<br/>
<button>登录</button>
</form>
</body>
</html>
第五步:运行项目,观察控制台输出
访问/user/list时控制台输出未登录,并跳转到登录页面
登录后再次访问成功访问列表页面
到此本篇知识点讲解结束,此外 本次整体讲解的spring boot项目已上传github