登录时设置Session
@Autowired
private HttpSession session;
@RequestMapping
public String login(User user){
if("admin".equals(user.getName()) && "123".equals(user.getPassword())){
//设置Session
session.setAttribute("username",user.getName());
return "succsess!"+session.getAttribute(user.getName());
}
return "用户名或密码错误!";
}
拦截时验证Session
@Autowired
private HttpSession httpSession;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//日志框架
logger.info("come in preHandle.....................");
//查看Session
if(httpSession.getAttribute("username") == null){
throw new RuntimeException("未登录!");
}
// 放行,继续向下执行
return true;
}
上面两个过程是没有问题的,但是在应用的时候总是会报一个空指针错误:拦截器里面httpSession代理的session里面没有数据。实际上错误的的原因是在下面:
不能在这里new ,因为new出来的对象没有放进容器里,导致下面的@Bean注解后的代码失效。
正确的config应该是:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(loginInterceptor())
.addPathPatterns("/**")
//不拦截的
.excludePathPatterns("/login/**");
}
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
}