Spring_Boot专栏 | ||
---|---|---|
上一篇 | 主目录 | 下一篇 |
【前言】
没有登录的情况下直接输入后台地址可以直接访问到后台管理页面,使用拦截器可以解决这类问题
拦截器
步骤一:设置session
在用户成功登陆以后,在服务器设置一个HttpSession
来保存用户的登录信息,用户登录的请求处理方法在LoginController里面实现:
@Controller
public class LoginController {
//@GetMapping
//@RequestMapping(value = "/user/login", mathod= RequestMethod.POST)
@PostMapping(value = "/user/login")
public String login(@RequestParam("username") String username,
@RequestParam("password") String password,
Map<String,Object> map,
HttpSession session){//map保存错误消息
if(!StringUtils.isEmpty(username)&&"123456".equals(password)){
//登录成功,
// 设置session
session.setAttribute("loginUser",username);
// 为防止表单重复提交,可以重定向
return "redirect:/main.html";
}else{
//false
map.put("msg","用户名或密码错误!");
return "login";
}
}
}
添加session:session.setAttribute("loginUser",username);
步骤二:登录检查
LoginHandlerInterceptor.class
进行登录检查,该类实现接口HandlerInterceptor
,重写preHandle方法,preHandle方法获取user的session,然后进行相应的处理
public class LoginHandlerInterceptor implements HandlerInterceptor {
//目标方法LoginController.login()执行之前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object user = request.getSession().getAttribute("loginUser");
if(user==null){//未登录,返回登录页
//设置错误消息
request.setAttribute("unAuthorized","没有访问权限,请先登录~");
//获取转发器,将请求和响应转发出去
request.getRequestDispatcher("/login").forward(request,response);
return false;
}else{
//已登陆,放行
return true;
}
}
}
第三步:注册拦截器
在config.MyMvcConfig.class类中重写addInterceptors()
方法以注册拦截器。该类实现WebMvcConfigurer
接口。
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/login","/","/user/login")
.excludePathPatterns("/asserts/**")
.excludePathPatterns("/webjars/**");
}
}
【注】addPathPatterns("/**")
拦截所有请求
excludePathPatterns("/login","/","/user/login")
不拦截login、user/login等请求./user/login
请求是点击登录按钮发送的请求,不能拦截
拦截器原理
拦截注册器添加拦截器进行注册,添加拦截路径和不拦截的请求路径。每次访问请求的路径时,如果这个请求路径被拦截器所拦截,拦截器会在preHandle()
方法中进行验证是否通过拦截,如果通过返回true,不通过返回false。