版權所有,不得轉載!
通過攔截器實現單點登錄的功能:可以實現登錄驗證,網頁關閉后不用重新驗證,一點登錄多網點授權
環境框架:spring mvc
設計流程圖:



XML配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd"> <!-- 攔截器配置 --> <mvc:interceptors> <mvc:interceptor>
<!--攔截路徑--> <mvc:mapping path="/*.do" />
<!----> <mvc:exclude-mapping path="/*/*.jsp" /> <bean class="com.tea.agent.LoginInterceptor" /> </mvc:interceptor> </mvc:interceptors> </beans>
攔截路徑后走攔截器判斷sessionid是否有效,判斷票據是否有效!有效繼續操作,無效跳轉用戶登錄系統
攔截器Interceptor代碼:
/**
* 單點登錄攔截器
* @author Mr song
*
*/
@Service
public class LoginInterceptor implements HandlerInterceptor{
@Autowired
private SessionService sessionService;
@Autowired
private TicketService ticketService;
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse response, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object arg2) throws Exception {
// TODO Auto-generated method stub
HttpSession httpSession=request.getSession();
String sessionId=httpSession.getId();//獲取session id
//將票據添加到cookie中-----------start-----------------------
//1獲取傳參票據
String ticket="";
if(request.getParameter("ticket")!=null)
//獲取通過get傳遞票據方法
ticket=request.getParameter("ticket").toString();
//2從cookie中獲取票據
String cookieTicket="";
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("ticket".equals(cookie.getName())) {
cookieTicket=cookie.getValue();
}
}
}
Cookie foo;
if(ticket!=null&&!"".equals(ticket)){
foo = new Cookie("ticket",ticket);
//設置cookie的最大保存時間
foo.setMaxAge(3600);
response.addCookie(foo);
}else if((cookieTicket!=null&&!"".equals(cookieTicket))){
foo = new Cookie("ticket",cookieTicket);
//設置cookie的最大保存時間
foo.setMaxAge(3600);
response.addCookie(foo);
}
//將票據添加到cookie中-----------end-----------------------
//獲取域名
StringBuffer url = request.getRequestURL();
//域名截取 baidu.com/name/age截取后為baidu.com
String tempContextUrl= url.delete(url.length() - request.getRequestURI().length(), url.length()).append("/").toString();
//創建實體記錄session 插入庫中
POJOSession session=new POJOSession();
session.setSession(sessionId);
if(sessionId!=null){
//1.查詢當前session id是否存在;
boolean flag=sessionService.validateByHTTPSessionId(sessionId);
if(idFlag){
//session存在
return true;
}else{
if(ticket!=null&&!"".equals(ticket)){
//2.1session id不存在 驗證票據;
boolean ticketFlag=ticketService.validateTicket(ticket);
if(ticketFlag){
//1.2.2 票據有效,將session id插入表中;
System.out.println("票據有效,將session id插入表中");
sessionService.creatSession(session);
//跳轉的頁面
return true;
}else{
System.out.println("票據無效,重定向SSOserver登錄頁用戶提交身份驗證請求");
//1.2.3票據無效,重定向SSOserver登錄頁用戶提交身份驗證請求
response.sendRedirect("url/verification?tempContextUrl="+tempContextUrl);
return false;
}
}else if(cookieTicket!=null&&!"".equals(cookieTicket)){
//2.1session id不存在 驗證票據;
boolean ticketFlag=ticketService.validateTicket(cookieTicket);
if(ticketFlag){
//1.2.2 票據有效,將session id插入表中;
System.out.println("票據有效,將session id插入表中");
sessionService.creatSession(session);
//跳轉的頁面
return true;
}else{
System.out.println("票據無效,重定向SSOserver登錄頁用戶提交身份驗證請求");
//1.2.3票據無效,重定向SSOserver登錄頁用戶提交身份驗證請求
response.sendRedirect("url/verification?tempContextUrl="+tempContextUrl);
return false;
}
}else{
System.out.println("票據無效,重定向SSOserver登錄頁用戶提交身份驗證請求");
//1.2.3票據無效,重定向SSOserver登錄頁用戶提交身份驗證請求
response.sendRedirect("url/verification?tempContextUrl="+tempContextUrl);
return false;
}
}
}
return false;
}
}
用戶登錄系統辦法sessionid是否有效,有效發放票據,無效跳轉登錄首頁
Controller層驗證方法
/** * 單點登錄驗證 * * @return ModelAndView */ @RequestMapping(method = RequestMethod.GET, value = "/verification") private ModelAndView verification(HttpServletRequest request,HttpServletResponse response, HttpSession httpsession, @ModelAttribute("tempContextUrl") String tempContextUrl) { String sessionId = httpsession.getId();// 獲取session id ModelAndView mv = new ModelAndView(); httpsession.setAttribute("tempContextUrl", tempContextUrl); if (sessionId != null) { // 1.查詢當前session id是否存在; boolean idFlag = sessionService.validateByHTTPSessionId(sessionId); if (idFlag) { // 1.1session id存在 ; // 生成票據 String ticket = ticketService.creatTicket(sessionId);// 將票據傳到量表 // 判斷域名,返回相對頁 mv.setView(new RedirectView("url?ticket="+ticket)); } else { // 2.1session id不存在 // 重定向SSOserver登錄頁用戶提交身份驗證請求,將域名傳遞到登錄頁 mv.setView(new InternalResourceView("/WEB-INF/login/login.jsp?")); } } return mv; }
用戶登錄驗證,插入sessionid ,創建票據
Controller層登錄驗證方法
/** * 用戶登錄驗證 * * @return */ @RequestMapping(method = RequestMethod.POST, value = "/login") private ModelAndView login(@ModelAttribute("pojoUser") PojoUser pojoUser, HttpServletRequest request, HttpServletResponse response) { String sessionId = request.getSession().getId();// 獲取session id PojoSession session = new PojoSession(); session.setSession(sessionId); // 獲取域名 String tempContextUrl=""; if(httpsession.getAttribute("tempContextUrl")!=null){ tempContextUrl=httpsession.getAttribute("tempContextUrl").toString(); } ModelAndView mv = new ModelAndView(); PojoAssertion assertion = new PojoAssertion(); assertion.setSecurityDomainName(tempContextUrl); assertion.setSsoSessionId(sessionId); // 驗證用戶信息 if (userAccountService.validateUserAccount(PojoUserAccount) != null) { // 插入session id sessionService.creatSession(session); // 生成票據 String ticket = ticketService.creatTicket(sessionId); // 斷言信息綁定A站點 assertionService.creatAssertion(assertion); // 判斷域名跳轉頁面 // 跳轉到量表 mv.setView(new RedirectView("url?ticket=" + ticket ))); } else { mv.setView(new InternalResourceView("/WEB-INF/login/login.jsp")); } return mv; }
