攔截器實現單點登錄功能(簡易)


版權所有,不得轉載!

通過攔截器實現單點登錄的功能:可以實現登錄驗證,網頁關閉后不用重新驗證,一點登錄多網點授權

環境框架: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;
    }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM