同域单点登录实例是根据慕课网上边的视频进行改写的比较简单,慕课网上边是用的status2,因为现在很少有项目使用status2了,基本都会使用springmvc所以自己就试着改了一下废话不多说,想明白怎么实现的自己去慕课网学习搜java实现单点登录就可以看到,这里我只贴出来代码以便自己知道。
工具使用的是idea创建的maven项目,这里稍微提一下,因为使用idea创建出来的web.xml会有问题,jsp页面使用el表达式会取不到modelAndView.addObject("returnUrl","/demo1/demo1")这个returnUrl的值,所以我把我改正之后的贴出来
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>springMvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/config/spring-mvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springMvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
接下来是pox.xm
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <org.springframework-version>4.2.3.RELEASE</org.springframework-version> <org.slf4j-version>1.7.13</org.slf4j-version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework-version}</version> <exclusions> <!-- Exclude Commons Logging in favor of SLF4j --> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${org.springframework-version}</version> <scope>test</scope> </dependency> <!-- Logging --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${org.slf4j-version}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${org.slf4j-version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${org.slf4j-version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.4</version> <scope>runtime</scope> </dependency> <!-- Servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies>
编写统一的登陆接口:
@Controller @RequestMapping("init") public class LonigController { @RequestMapping public String initViews(){ return "login"; } @RequestMapping("login") public String doLogin(Model model, HttpServletResponse response){ if(CheckLogin.checkUserPass(model.getUserName(),model.getPassWord())){ Cookie cookie=new Cookie(CheckLogin.SSOCOOKIE,CheckLogin.COOKIES); cookie.setPath("/"); response.addCookie(cookie);//向客户端添加cookie return model.getReturnUrl(); } return "/init"; } }
统一登录接功能是添加浏览器cookie与校验账户与用户名和密码对应的jsp页面:
--%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head> <title>Title</title> </head> <body> <form method="post" action="/init/login"> 用户名:<input type="text" name="userName" /> 密码:<input type="text" name="passWord" /> <input type="hidden" name="returnUrl" value="${returnUrl}"> <input type="submit" value="提交" /> </form> </body> </html>
编写demo1与demo2的主页对应的jsp与Java实现类
demo1的java代码:
@Controller public class Demo1Controller { @RequestMapping("initdemo1") public ModelAndView initDemo1(ModelAndView modelAndView,HttpServletRequest request){ if(CheckLogin.checkCookie(request)){ modelAndView.setViewName("/demo1/demo1"); }else{ modelAndView.addObject("returnUrl","/demo1/demo1"); modelAndView.setViewName("login"); } return modelAndView; } }
demo1的jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head> <title>Title</title> </head> <body> 欢迎来到demo1的主页,这是demo1 </body> </html>
demo2的java代码
@Controller public class Demo2Controller { @RequestMapping("initdemo2") public ModelAndView initDemo1(ModelAndView modelAndView, HttpServletRequest request){ if(CheckLogin.checkCookie(request)){ modelAndView.setViewName("/demo2/demo2"); }else{ modelAndView.addObject("returnUrl","/demo2/demo2"); modelAndView.setViewName("init"); } return modelAndView; } }
demo2的jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head> <title>Title</title> </head> <body> 欢迎来到demo2的主页,这是demo2 </body> </html>
这里两个代码代码非常的类似因为是在一个项目中模拟进行的单点登录,可以拆成两个项目,可自行进行扩展
然后是工具类的编写
package com.utils; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; public class CheckLogin { public static final String USERNAME="admin"; public static final String PASSWORD="1"; public static final String COOKIES="sso" ; public static final String SSOCOOKIE="ssocookie"; public static boolean checkCookie(HttpServletRequest request){ Cookie [] cookies=request.getCookies(); if(cookies!=null){ for (Cookie cookiei:cookies) { if(cookiei.getName().equals(SSOCOOKIE)&&cookiei.getValue().equals(COOKIES)){ return true; } } } return false; } public static boolean checkUserPass(String userName,String passWord){ if(userName.equals(USERNAME)&&passWord.equals(PASSWORD)){ return true; } return false; } }
这个工具类对应的两个方法一个是判断Cookie是否存在,另一个是判断用户名与密码
下面是用到的实体类:
package com.model; public class Model { private String userName; private String passWord; private String returnUrl; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } public String getReturnUrl() { return returnUrl; } public void setReturnUrl(String returnUrl) { this.returnUrl = returnUrl; } }
这就是同域单点登录实现最简单的例子至于跨域单点登录还没开始学习,稍后学习之后会更新到博客中最后给一张工程图片可以参考