一、基于session的身份认证方案
1.方案图示
2.比较通用的鉴权流程实现如下:
在整个流程中有两个拦截器。
第一个拦截器AuthInteceptor是为了每一次的请求的时候都先去session中取user对象,如果session中有,就放user对象到threadlocal中。这是为了业务处理的时候能直接获取用户对象。
第二个拦截器AuthActionInteceptor是先看页面是否需要登录,如果不需要登录,则直接进行业务逻辑处理;如果需要登录,则判断是否已经登录(UserContext.getUser()是否为空),没有登录则重定向到登录页面,登录后是会把用户信息放到session当中的 。
@Component public class AuthInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Map<String, String[]> map = request.getParameterMap(); map.forEach((k,v) -> { if (k.equals("errorMsg") || k.equals("successMsg") || k.equals("target")) { request.setAttribute(k, Joiner.on(",").join(v)); } }); String reqUri = request.getRequestURI(); if (reqUri.startsWith("/static") || reqUri.startsWith("/error") ) { return true; } HttpSession session = request.getSession(true);//参数为true,没有session则创建新的 User user = (User)session.getAttribute(CommonConstants.USER_ATTRIBUTE); if (user != null) { UserContext.setUser(user); } 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 { UserContext.remove(); } }