单点登录实现
发布日期:2021-06-30 16:29:00
浏览次数:3
分类:技术文章
本文共 10621 字,大约阅读时间需要 35 分钟。
单点登录实现
本文是基于单点登录的代码简单实现,具体涉及到了三个工程
一个认证系统,两个子系统 。代码下载地址:
先看一下系统显示效果。
未登录状态访问子系统会直接跳转到终端认证系统
从任意子系统登录后,切换子系统不用再次登录
从任意子系统退出登录后,再次访问子系统跳转到认证页面里重新登录
实现代码
首先是认证系统SSOAuth
package com.sso.util;import java.io.IOException;import java.io.PrintWriter;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.Date;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentMap;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class SSOAuth extends HttpServlet { private static final long serialVersionUID = 1L; private static ConcurrentMap子系统accounts; private static ConcurrentMap SSOIDs; private String cookiename = "DesktopSSOID"; private String domainname = null; public void init(ServletConfig config) throws ServletException { domainname = config.getInitParameter("domainname"); cookiename = config.getInitParameter("cookiename"); SSOIDs = new ConcurrentHashMap (); userMsg(); } // 连接数据库查找用户信息 public void userMsg() { accounts = new ConcurrentHashMap (); Connection conn = null; String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF8"; String username = "root"; String password = "root"; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(url, username,password); PreparedStatement ps = conn.prepareStatement("select * from user"); ResultSet rs = ps.executeQuery(); while (rs.next()) { accounts.put(rs.getString("username"), rs.getString("password")); System.out.println(accounts.toString()); } rs.close(); ps.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf8"); processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf8"); processRequest(request, response); } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getParameter("action"); String result ="failed"; PrintWriter out = response.getWriter(); if (action == null) { handlerFromLogin(request, response); } else if (action.equals("authcookie")) { String myCookie = request.getParameter("cookiename"); if (myCookie != null){ result = authCookie(myCookie); } out.print(result); out.close(); } else if (action.equals("authuser")) { result = authNameAndPasswd(request, response); out.print(result); out.close(); } else if (action.equals("logout")) { String myCookie = request.getParameter("cookiename"); logout(myCookie); out.close(); } } /** * 验证用户名、密码,然后跳回原页面 */ private void handlerFromLogin(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); String pass = accounts.get(username); if ((pass == null) || (!pass.equals(password))) { //DigestUtils.md5Hex(password) request.setAttribute("msg", "登录失败"); request.getRequestDispatcher("/failed.jsp").forward(request, response); } else { String gotoURL = request.getParameter("goto") + "index.jsp"; String newID = createUID(); SSOIDs.put(newID, username); this.add2Cookie(response, this.cookiename, newID, 60 * 1000); System.out.println("登录成功, 返回前url:" + gotoURL); response.sendRedirect(gotoURL); } } /** * 添加至cookie */ private void add2Cookie(HttpServletResponse response, String cookieName, String cookieValue, int maxAge) { Cookie cookie = new Cookie(cookieName, cookieValue); cookie.setDomain(this.domainname); cookie.setPath("/"); cookie.setMaxAge(maxAge); // cookie一年内有效60*60*24*365 response.addCookie(cookie); } /** * 身份验证 * @param value * @return */ public static String authCookie(String value) { String result = SSOIDs.get(value); if (result == null) { result = "failed"; System.out.println("身份验证失败"); } else { System.out.println("身份验证成功"); } return result; } /** * 验证用户名和密码 正确返回当前登录用户uid * @param request * @param response * @return */ protected String authNameAndPasswd(HttpServletRequest request,HttpServletResponse response) { String username = request.getParameter("username"); String password = request.getParameter("password"); String pass = (String) accounts.get(username); if ((pass == null) || (!pass.equals(password))) //DigestUtils.md5Hex(password) return "failed"; String newID = createUID(); SSOIDs.put(newID, username); return newID; } /** * 创建uid * @return String */ private static String createUID() { Date now = new Date(); long time = now.getTime(); return "sso" + time; } /** * 注销 * @param UID */ private void logout(String UID) { System.out.println("---退出登录---" + UID); SSOIDs.remove(UID); } }
package com.sso.filter;import java.io.IOException;import java.io.PrintStream;import java.io.PrintWriter;import java.io.StringWriter;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.httpclient.HttpClient;import org.apache.commons.httpclient.methods.GetMethod;public class SSOFilter implements Filter { private FilterConfig filterConfig = null; private String cookieName = "DesktopSSOID"; private String SSOServiceURL = "http://localhost:8080/SSOAuth/SSOAuth"; private String SSOLoginPage = "http://localhost:8080/SSOAuth/login.jsp"; public void init(FilterConfig filterConfig) { System.out.println("------demo1初始化-----"); this.filterConfig = filterConfig; this.cookieName = filterConfig.getInitParameter("cookieName"); this.SSOServiceURL = filterConfig.getInitParameter("SSOServiceURL"); this.SSOLoginPage = filterConfig.getInitParameter("SSOLoginPage"); } public void destroy() {} public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { // 控制台输出 拦截成功 System.out.println("------demo1拦截器-------"); HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; String result = "failed"; String path = request.getContextPath(); String url = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; System.out.println("demo1-----loginout请求-----"+url); // 获取路径参数?后部分内容 String qstring = request.getQueryString(); if (qstring == null) qstring = ""; // 检查http请求的head是否有需要的cookie String cookieValue = ""; Cookie[] diskCookies = request.getCookies(); // 如果登录找到对应的cookie if (diskCookies != null) { for (int i = 0; i < diskCookies.length; i++) { if (diskCookies[i].getName().equals(this.cookieName)) { cookieValue = diskCookies[i].getValue(); // 如果找到了相应的cookie则效验其有效性 result = SSOService(cookieValue); System.out.println("-----demo1找到了 cookies!----"); } } } // 效验失败或没有找到cookie,则需要登录 if (result.equals("failed")) { response.sendRedirect(this.SSOLoginPage + "?goto=" + url); } else if (qstring.indexOf("logout") > 1) { // logout服务 System.out.println("-----从demo1退出登陸!----"); logoutService(cookieValue); response.sendRedirect(this.SSOLoginPage + "?goto=" + url); } else { // 效验成功 request.setAttribute("SSOUser", result); Throwable problem = null; try { chain.doFilter(req, res); } catch (Throwable t) { problem = t; t.printStackTrace(); } if (problem != null) { if ((problem instanceof ServletException)) throw ((ServletException) problem); if ((problem instanceof IOException)) throw ((IOException) problem); sendProcessingError(problem, res); } } } // 校验登录cookie private String SSOService(String cookievalue) throws IOException { String authAction = "?action=authcookie&cookiename="; HttpClient httpclient = new HttpClient(); GetMethod httpget = new GetMethod(this.SSOServiceURL + authAction+ cookievalue); try { httpclient.executeMethod(httpget); String result = httpget.getResponseBodyAsString(); System.out.println("------------demo1------------"+result); return result; } finally { httpget.releaseConnection(); } } // 校验登出cookie private void logoutService(String cookievalue) throws IOException { String authAction = "?action=logout&cookiename="; HttpClient httpclient = new HttpClient(); GetMethod httpget = new GetMethod(this.SSOServiceURL + authAction+ cookievalue); try { httpclient.executeMethod(httpget); httpget.getResponseBodyAsString(); } finally { httpget.releaseConnection(); } } private void sendProcessingError(Throwable t, ServletResponse response) { String stackTrace = getStackTrace(t); if ((stackTrace != null) && (!stackTrace.equals(""))) { try { response.setContentType("text/html"); PrintStream ps = new PrintStream(response.getOutputStream()); PrintWriter pw = new PrintWriter(ps); pw.print("\n\nError \n\n\n"); pw.print("The resource did not process correctly
\n\n"); pw.print(stackTrace); pw.print("\n"); pw.close(); ps.close(); response.getOutputStream().close(); } catch (Exception ex) { } } else{ try { PrintStream ps = new PrintStream(response.getOutputStream()); t.printStackTrace(ps); ps.close(); response.getOutputStream().close(); } catch (Exception ex) {} } } public static String getStackTrace(Throwable t) { String stackTrace = null; try { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); t.printStackTrace(pw); pw.close(); sw.close(); stackTrace = sw.getBuffer().toString(); } catch (Exception ex) { } return stackTrace; } public FilterConfig getFilterConfig() { return this.filterConfig; } public void setFilterConfig(FilterConfig filterConfig) { this.filterConfig = filterConfig; }}
转载地址:https://kevin.blog.csdn.net/article/details/78678930 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月09日 13时10分09秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
大数据开发者应该知道的分布式系统 CAP 理论
2019-05-01
HBase在人工智能场景的使用
2019-05-01
Apache Spark 2.4 中解决复杂数据类型的内置函数和高阶函数介绍
2019-05-01
数据结构与算法?看这篇就够了!
2019-05-01
Apache Kafka:优化部署的 10 种最佳实践
2019-05-01
HBase 中加盐之后的表如何读取:Spark 篇
2019-05-01
一篇文章了解 Spark Shuffle 内存使用
2019-05-01
【免费下载】某平台3980元Hadoop大数据/机器学习全套视频,仅此1次
2019-05-01
Apache Hive 联邦查询(Query Federation)
2019-05-01
为什么说流处理即未来?
2019-05-01
Leetcode 剑指 Offer 39. 数组中出现次数超过一半的数字 c#
2019-05-01
Leetcode 35. 搜索插入位置 c#
2019-05-01
LeetCode64:最小路径和
2019-05-01
LeetCode931. 下降路径最小和
2019-05-01
LeetCode62. 不同路径
2019-05-01
记gdb调试一次报错:Missing separate debuginfos, use: zypper install glibc-32bit-debuginfo-2.22-15.3.x86_64
2019-05-01
LeetCode242. 有效的字母异位词
2019-05-01
LeetCode83. 删除排序链表中的重复元素
2019-05-01
关于301和302重定向的理解
2019-05-01