前言
拦截器一般用于检测用户是否有登录, 防止未登录时用户直接输入映射地址跳转到需要登录的页面
正文
package com.atguigu.springboot.component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginHandlerInterceptor implements HandlerInterceptor {
/*
处理器方法执行前执行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String user = (String) request.getSession().getAttribute("loginUser");
if(null==user){
request.setAttribute("msg", "你仍未登录...");
request.getRequestDispatcher("/index").forward(request, response);
return false;
}
else{
return true;
}
}
/*
处理器方法执行后执行
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
/*
页面渲染后执行
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
创建一个LoginHandlerInterceptor实现拦截器接口的类, 重写preHandle方法;
其中request.getSession().getAttribute(“loginUser”);
是在登录成功时 session.setAttribute(“loginUser”,username);
已经设置好的
这里为何要用服务端跳转呢?
1、客户端跳转不能传送数据, 所以 request.setAttribute(“msg”, "你仍 未登录…"); 不能传送到页面上。
2、如果要用客户端跳转的话,要这样写response.sendRedirect(“/server.context-path/rrr”);
@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {
//保险做法是将该拦截器投入到容器中, 否则可能会拦截器会报某个变量空指针异常
@Bean
public LoginHandlerInterceptor getLoginHandlerInterceptor() {
return new LoginHandlerInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加拦截器
registry.addInterceptor(getLoginHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/rrr");
};
在mvc配置中加上addInterceptors方法;
addPathPatterns("/") 表示所有映射地址都会拦截;**
excludePathPatterns("/rrr");是指除了这些映射地址之外