springboot使用拦截器
Posted 暴躁的程序猿啊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot使用拦截器相关的知识,希望对你有一定的参考价值。
我们平时在开发项目的时候 访问某些页面 需要我们登陆了 才能访问 如果 没登录我们就让他跳转到登录页面
demo
这是一个controller 使用了thymeleaf 模板引擎
我们判断登录的时候并没有访问数据库 模拟了一个判断 账号不为空 密码为111登录成功 登陆成功后 把用户信息存到了session中
/**
* 访问当前项目的根路径或 /login路径 跳转到登录页
* @return login.html页面
*/
@GetMapping({"/","/login"})
public String loginPage(){
return "login";
}
@PostMapping("/login")
public String main(User user, HttpSession session, Model model){
if (!ObjectUtils.isEmpty(user.getUsername())&& "111".equals(user.getPassword())){
//把登录成功的用户保存起来
model.addAttribute("msg","登录成功");
session.setAttribute("loginUser",user);
//登录成功重定向到main.html
return "redirect:index.html";
}else{
//回到登录页
model.addAttribute("msg","账号密码错误");
return "login";
}
}
@GetMapping("/index.html")
public String mainPage(HttpSession session){
return "index";
}
创建一个pojo类存储 登录信息
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User implements Serializable {
private String username;
private String password;
}
我们创建一个拦截器
在前置处理器中 定义了规则 如果 session中没有用户的信息 即用户未登录跳转到登录页面
public class LoginInterceptor implements HandlerInterceptor {
/**
* 目标方执行之前
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//登录检查逻辑
HttpSession session = request.getSession();
Object loginUser = session.getAttribute("loginUser");
if (loginUser!=null){
//放行
return true;
}
//为登录跳转到登录页
request.setAttribute("msg","请先登录");
// response.sendRedirect("/");
request.getRequestDispatcher("/").forward(request,response);
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 {
}
/**
* 页面渲染之后
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
我们把自己编写的拦截器注册到boot中
我们创建一个配置类实现 WebMvcConfigurer 接口
我们在addPathPatterns方法中指定拦截的路径
这里注意 我们如果配置了/** 即为全部拦截 静态资源也会被拦截 所以我们要排除静态资源的路径
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
//拦截哪些路径 /** 所有请求都会被拦截包括静态资源
.addPathPatterns("/**")
//放行哪些路径
.excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**");
}
}
这时我们运行 访问请求
http://localhost:8080/index.html
会给我们拦截跳转到登录页面
配置成功啦!!!
以上是关于springboot使用拦截器的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot拦截器使用@Autowired注入接口为null解决方法
OkHttpInterceptor 从 kotlin 拦截器导航到登录片段
Java 微服务 day02 源代码 SpringBoot 实战开发 SpringMVC高级配置:拦截器:HandlerExecutionChain