1、基于session的身份认证方案html
1.方案图示浏览器
2.比较通用的鉴权流程实现以下:缓存
@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(); } }
@Component public class AuthActionInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { User user = UserContext.getUser(); if (user == null) { String msg = URLEncoder.encode("请先登陆","utf-8"); String target = URLEncoder.encode(request.getRequestURL().toString(),"utf-8"); if ("GET".equalsIgnoreCase(request.getMethod())) { response.sendRedirect("/accounts/signin?errorMsg=" + msg + "&target="+target); return false;//修复bug,未登陆要返回false }else { response.sendRedirect("/accounts/signin?errorMsg="+msg); return false;//修复bug,未登陆要返回false } } 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 { } }
@Configuration public class WebMvcConf extends WebMvcConfigurerAdapter { @Autowired private AuthActionInterceptor authActionInterceptor; @Autowired private AuthInterceptor authInterceptor; @Override public void addInterceptors(InterceptorRegistry registry){ registry.addInterceptor(authInterceptor).addPathPatterns("/**").excludePathPatterns("/static"); registry .addInterceptor(authActionInterceptor).addPathPatterns("/house/toAdd") .addPathPatterns("/accounts/profile").addPathPatterns("/accounts/profileSubmit") .addPathPatterns("/house/bookmarked").addPathPatterns("/house/del") .addPathPatterns("/house/ownlist").addPathPatterns("/house/add") .addPathPatterns("/house/toAdd").addPathPatterns("/agency/agentMsg") .addPathPatterns("/comment/leaveComment").addPathPatterns("/comment/leaveBlogComment"); super.addInterceptors(registry); } }
2、基于token的身份认证方案安全
优势:服务器