导语
在Spring应用中,某些资源必须要登录后才能查看,这时候我们就需要定义一个登录拦截器,将未登录的用户请求拦截至☞登录页。
实现
- 首先定义我们的拦截器,这里需要实现HandlerInterceptor接口:
public class LoginHandlerInterceptor implements HandlerInterceptor {
/**
* 登录拦截器
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object username = request.getSession().getAttribute("username");
if (username != null) {
return true;
} else {
request.setAttribute("login_error", "请先登录");
request.getRequestDispatcher("/").forward(request, response);
return false;
}
}
}
这里我们简单的从登录请求中获取session,如果其中有用户名这个属性且不为空,我们就认为用户已经登录了;如果用户未登录,将请求转发至登录页,并提示用户登录。
- 在登录接口中将用户名写入到session:
@RequestMapping("/user/login")
public String login(String username, @RequestParam("password") String passwd, ModelMap modelMap, HttpSession session) {
if (!StringUtils.isEmpty((username)) && !StringUtils.isEmpty(passwd) && "admin".equals(username) && "admin".equals(passwd)) {
// 将登录信息写入session
session.setAttribute("username", username);
return "redirect:/user/list";
} else {
modelMap.addAttribute("login_error", "用户名密码错误");
return "login";
}
}
- 将我们实现的登录拦截器注册到Spring容器
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 注册登录拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/", "/user/login", "/css/**", "/js/**", "/img/**");
}
}
这里我们拦截了除首页(/)、登录请求(/user/login)以及相关静态资源(/css/**等)外的所有请求。
至此,我们就简单做了一个登录拦截器。