springboot项目中,拦截器可以用作以下用途:
- 用于登录验证;
- 性能检查;
- 日志记录;
以登录验证为例:
需要重写一个拦截器、写一个配置类
重写拦截器代码如下(拦截器在controller之前执行)
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object user = request.getSession().getAttribute("user");
if (user == null){
request.setAttribute("msg","当前没有权限,请先登录");
request.getRequestDispatcher("/login").forward(request,response);
return false;//流程中断
}else {
return true;//流程继续
}
}
}
配置类代码:addPathPatterns//这个是添加拦截路径,excludePathPatterns这个是排除拦截的路径多个路径中间用逗号隔开
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加自定义拦截器,添加拦截路径和排除拦截路径
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/","/index.html","/login","/userLogin","/static/**");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
WebMvcConfigurer.super.addResourceHandlers(registry);
}
}
controller
@Controller
public class LoginController {
@PostMapping("/userLogin")
public String userLogin(String username, String password, Model model,HttpSession session){
if (!StringUtils.isEmpty(username) && "123456".equals(password)){
//记录登录状态
session.setAttribute("user",username);
//跳转到主页
return "redirect:main.html";
}else {
model.addAttribute("msg","用户名或密码错误");
return "login";
}
}
}