Java的SSO同一域下单点登录

一、首先我们准备一个简单的web项目,只要可以点击记住密码以后下次自动登录的web项目,我这里用的项目是 MobileSecurity自己以前写好的

①.主要是在登录的时候把用户的用户名和密码存到cookie中,代码如下:
     String cookieValueBase64 = new            String (Base64Utils. encodeBase64 (Base64Utils. encodeBase64 (userName+ ":" +passWord))); // cookie 值两次加密,解密也要 2
      Cookie userCookie= new Cookie(Global. COOKIE_KEY ,cookieValueBase64);
       userCookie.setMaxAge( 60 * 60 * 24 * 7 ); // 一周,存活期为一个月 30*24*60*60
       userCookie.setPath( "/" );
       userCookie.setDomain( " sincerain.com " );
       response.addCookie(userCookie);

②.然后在过滤器中拦截用户请求,看是否携带cookie,如果携带,则读取cookie,然后执行登录操作(自动登录)

       Cookie cookies[] = request1.getCookies();
       String cookieValue = null ;
       if (cookies!= null ){
       for ( int i = 0 ; i < cookies. length ; i++){
       if (Global. COOKIE_KEY .equals(cookies[i].getName())) {
       cookieValue = Base64Utils. decodeBase64 (Base64Utils . decodeBase64 (cookies[i].getValue())); // cookie 解码
       String[] value = cookieValue.split( ":" );
       String userName = value[ 0 ];
       String passWord = value[ 1 ];
       JSONObject data = userService .userLogin(userName,passWord);
       if (data.get( "message" ).equals( 100 )) {
       request.getSession().setAttribute(Global. USER_SESSION_KEY , data.get( "user" ));
       ResponseUtils. renderJson (response1, data.toString());
       }
       chain.doFilter(request, response);
       return ;
       }
       }
       }
③.然后就是注销登录这边也要把cookie销毁掉(销毁设置cookie的MaxAge为0就可以了)

      Object user = session.getAttribute(Global. USER_SESSION_KEY );
      session.removeAttribute(Global. USER_SESSION_KEY ); // 清除 session
      Cookie cookie = new Cookie(Global. COOKIE_KEY , null ); // 清除 cookie
      cookie.setMaxAge( 0 );
      cookie.setPath( "/" );
      cookie.setDomain( " sincerain.com " );
      response.addCookie(cookie);

☆.重要说明: 在登录方法中设置cookie的 setDomain( " sincerain.com " );属性是为了保证在同域名下,访问其他网站会携带同样的cookie(如果不携带cookie,过滤器就不会执行自动登录就无法做到单点登录了)

☆. 在注销登录方法中设置cookie的 setDomain( " sincerain.com " );属性是为了解决 在同域名下 当其中一个网站用户点击了注销以后,那么其他网站上的cookie也被销毁掉, 如果不在注销方法设置Domain就会导致在其中一个网站上注销以后,在访问第二个网站还是会自动登录

☆. 在登录方法中设置cookie的 setPath ( "/ " );属性是为了保证在同域名下,把cookie存放在更目录下,举个例子说明(比如现在网站网址是 http://music.sincerain.com:8080/MobileSecurity/ ,当我们登录的时候,他会把cookie存放在 MobileSecurity/ 目录下,那么当我们访问 http://music.sincerain.com:8080/MobileSecurity/ index/的时候还是会读取到cookie 如果不设置 setPath ( "/ " );那么在你访问网站根目录下的index的时候他是读取不到cookie的

二、项目准备好以后,为了方便测试,我们修改电脑的hosts文件,路径在:"C:\Windows\System32\drivers\etc\hosts",添加2行,对应不同的web网站,但是属于同一个 sincerain.com 域名下
127.0.0.1        mail.sincerain.com
127.0.0.1        music.sincerain.com


三、然后我们新解压一个 apache-tomcat-7.0.76,在 apache-tomcat-7.0.76目录 下新建2个文件夹music、mail分别来存放我们的web网站资源
Java的SSO同一域下单点登录_第1张图片

四、然后分别在 music和mail文件夹下新建一个ROOT目录用于存放我们的web网站资源

apache-tomcat-7.0.76\music\ROOT
apache-tomcat-7.0.76\mail\ROOT

五、把我们编译部署好的项目分别copy到music和mail文件夹下:注意是copy所有资源,而不是一个项目(就是复制 MobileSecurity文件夹下面的所有资源,但是不要 MobileSecurity文件夹

Java的SSO同一域下单点登录_第2张图片

六、然后配置tomcat的server.xml文件 修改为80端口:如下

               connectionTimeout="20000"
               redirectPort="8443" />

然后新增一个Host节点,修改host节点中的name等于 music.sincerain.com ,然后在每一个Host节点中新增一个 Context节点用于部署项目, docBase指向我们的muisc文件夹下面的ROOT。

"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />
            

修改host节点中的name 等于 mail.sincerain.com ,然后在每一个Host节点中新增一个 Context节点用于部署项目, docBase指向我们的muisc文件夹下面的ROOT。

      "  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />
            
      

这个时候启动tomcat,会报一个错误
java.lang.IllegalStateException: Web app root system property already set to different value: 'webapp.root' = [C:\Users\HONGLINCHEN\Desktop\apache-tomcat-7.0.76\mail\ROOT\] instead of [C:\Users\HONGLINCHEN\Desktop\apache-tomcat-7.0.76\webapps\MobileSecurity\] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!
大概意思是说web.xml中的 webAppRootKey重复了,
解决办法是:在每一个项目中的web.xml中新增如下属性
music中
< context-param >
< param-name > webAppRootKey param-name >
< param-value > MobileSecurity.root param-value >
context-param >
mail中
< context-param >
< param-name > webAppRootKey param-name >
< param-value > MobileSecurity1.root param-value >
context-param >


重启tomcat问题解决,我们访问 http://mail.sincerain.com/mail/ 登录点击记住密码。登录以后进入到主页,我们推出浏览器,直接访问music项目的主页 http://music.sincerain.com/music/loginCenter 发现他也是直接进去了。单点登录没问题
再来测试注销,

我们在 http://music.sincerain.com/music/loginCenter 点击注销,music项目跳转到了登录页面。但是刷新mail的主页,发现并没有跳转到登录页面,这是因为你虽然在music中已经把cookie删除了但是mail人家session还是存在的 人家又没有点击注销,music注销只是清除了他们cookie。那么就是说mail的cookie也被清除了,至少可以证明把浏览器关掉,直接访问 http://mail.sincerain.com/mail/loginCenter 他是不会自动进入首页,而是跳转到登录,经过验证,的确是这样!这样一个简单的单点登录就解决了,下一篇文章介绍不同域下面得单点登录

你可能感兴趣的:(Java的SSO同一域下单点登录)