javaWeb简单的单点登录sso实现方法

总结一个简单的sso单点登录实现方法,先上一张思路图:

思路不复杂,在一个Filter中如下:

 

String baseUrl="你的基础系统路径";//比如是120.24.270.95:8080
	String host=request.getHeader("HOST");
	String url=request.getRequestURI();
	if(request.getQueryString()!=null){
		url=url+"?"+request.getQueryString();
	}
	/***********单点登录***********/
	if(session.getAttribute(session_user_KEY)==null){//获取session中用户的登录信息
		String sso=request.getParameter("sso");
		if(sso!=null && sso.equals("1")){//sso标记
			String userName=request.getParameter("userName");
			String password=request.getParameter("password");
			ssoLoginSrv.login(userName, password, request);//如果有sso标记,获取参数中的用户名和密码,判断是否合法,合法则可免登。
		}else{		/*加上sso标志*/
			if(ex.indexOf("?")>0){
				ex=ex+"&sso=1";
			}else{
				ex=ex+"?sso=1";
			}
			//带着url转发到基础系统
			response.sendRedirect(baseUrl+"/loginAction!login.do?url="
						+ URLEncoder.encode("http://" + host + url, "utf8"));
			return;
			}
	}

 

 

 

转发到基础系统,如果基础系统已登录,则子系统可实现免登,

 

 

 

是Action中的一个方法,执行完带着用户名密码转回去,

如下方法:

 

public String login(){	
	Map session=ActionContext.getContext().getSession();
	User loginUser=(User)session.get(session_user_KEY);
	try{
		if(loginUser==null){			
			loginUser=userSrv.login(user.getUserName(), user.getPassword());
		}
	}catch (Exception e) {
		log.error(e.getMessage());
		this.setMsg(e.getMessage());
		return "loginNo";
	}
	if(isNull(url)){
		url="/index.jsp";
	}else if(url.indexOf("sso=1")>0){
		String str1=DesUtil.encode(loginUser.getUserName(), ssoLoginPwdKey, "utf8");
		String str2=DesUtil.encode(loginUser.getPassword(),ssoLoginPwdKey, "utf8");
		url=url+"&userName="+str1+"&password="+str2;
	}		
	return "loginOk";
}session_user_KEY);
	try{
		if(loginUser==null){			
			loginUser=userSrv.login(user.getUserName(), user.getPassword());
		}
	}catch (Exception e) {
		log.error(e.getMessage());
		this.setMsg(e.getMessage());
		return "loginNo";
	}
	if(isNull(url)){
		url="/index.jsp";
	}else if(url.indexOf("sso=1")>0){
		String str1=DesUtil.encode(loginUser.getUserName(), ssoLoginPwdKey, "utf8");
		String str2=DesUtil.encode(loginUser.getPassword(),ssoLoginPwdKey, "utf8");
		url=url+"&userName="+str1+"&password="+str2;
	}		
	return "loginOk";
}

在strust.xml中配置转发到url,带着用户名密码回到一开始的子系统,还是被Filter拦截。

 

再次进入子系统Filter的时候,拿到sso标记,和用户名密码,验证是否合法,合法则往下执行,不合法跳转到登录页面。

 

你可能感兴趣的:(javaweb)