原理:
1.通过数字签名对用户名签名,把签名放在cookie中,在另一个应用中验证这个签名
2.以上信息通过url直接传递参数
1.签名类
public class SecurityUtil {
public static final String PUBLIC_KEY = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJLyPRvDVQhYA5gGlAvZZr1YCLFgSSWAB4fvSa8ViZo7OBWCJBdn73x5qTDgwwZY9FbBvpmz+wQQozLWAGfc2ecCAwEAAQ==";
public static final String PRIVATE_KEY = "MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAkvI9G8NVCFgDmAaUC9lmvVgIsWBJJYAHh+9JrxWJmjs4FYIkF2fvfHmpMODDBlj0VsG+mbP7BBCjMtYAZ9zZ5wIDAQABAkAUAmBH04VUqYdzwBGQu3298qrcXFwZeyGLZQ4HhUtDcO8Zli+Na25LzWCtizYOyO9PsTFKdFhMiJN+XaAed04BAiEA6wifzFBG2ph86oZOqK1CjmL4CHIzt4KXt4YHB5TqLqcCIQCgDf6nFESpR7YpaWXSdZLWnZlCnUyMdaDaCM2jcyaiwQIhAOHRJG+ShbELJ6HRLwwjg7n4XuUGjKf5YjmjHWfsbOArAiAqO6cfVTTM6jRB9yK8BvQpF0rSjgkd4wf/oGUKpR7jwQIhAIs81vXXHlLMHjTWQlUDh8gpGAvIORViBbeOvmb8OrLF";
public static String sign(String data) {
try {
Signature sig = Signature.getInstance("SHA1WithRSA");
BASE64Decoder decoder = new BASE64Decoder();
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(
decoder.decodeBuffer(PRIVATE_KEY));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
sig.initSign(privateKey);
sig.update(data.getBytes());
BASE64Encoder encoder = new BASE64Encoder();
String signature = encoder.encode(sig.sign());
// log.info("signature=" + signature);
return signature.replaceAll("\r\n", "");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static boolean verify(String data, String signature) {
try {
Signature sig = Signature.getInstance("SHA1WithRSA");
BASE64Decoder decoder = new BASE64Decoder();
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(decoder
.decodeBuffer(PUBLIC_KEY));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
sig.initVerify(publicKey);
sig.update(data.getBytes());
boolean verify = sig.verify(decoder.decodeBuffer(signature));
// log.info("data=" + data + " signature=" + signature + " verify="
// + verify);
return verify;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
2.Servlet:
public class LoginServlet extends HttpServlet {
private static Log log = LogFactory.getLog(LoginServlet.class);
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userName = request.getParameter("userName");
String password = request.getParameter("password");
log.info("userName=" + userName + " password=" + password);
if (userName.equals("admin") && password.equals("admin")) {
request.getSession().setAttribute("user", userName);
String sign = SecurityUtil.sign(userName.trim());
if (sign != null) {
Cookie unCookie = new Cookie("userName", userName);
unCookie.setMaxAge(60 * 30);
unCookie.setPath("/");
response.addCookie(unCookie);
Cookie signCookie = new Cookie("sign", sign);
signCookie.setMaxAge(60 * 30);
signCookie.setPath("/");
response.addCookie(signCookie);
}
log.info("userName=" + userName + " sign=" + sign);
response.sendRedirect(request.getContextPath() + "/main.jsp");
// RequestDispatcher dispatcher = getServletContext()
// .getRequestDispatcher("/main.jsp");
// dispatcher.forward(request, response);
} else {
request.setAttribute("errorMsg", "登录失败!");
RequestDispatcher dispatcher = getServletContext()
.getRequestDispatcher("/index.jsp");
dispatcher.forward(request, response);
}
}
}
3.index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录</title>
</head>
<body>
<form action="<%=request.getContextPath()%>/loginServlet" method="post">
<table style="padding: 0; margin: 0">
<%
if (request.getAttribute("errorMsg") != null) {
%>
<tr>
<td colspan=2 align=center><font color=red>${errorMsg}</font></td>
</tr>
<%
}
%>
<tr>
<td width=100 align=right>用户名:</td>
<td><input type="text" name="userName"></td>
</tr>
<tr>
<td align=right>密码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td colspan=2 align=center><input type="submit" value="登录" /> <input
type="reset" value="重置" /></td>
</tr>
</table>
</form>
</body>
</html>
4.main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="com.agor.weather.servlet.LoginServlet"%>
<%@page import="com.agor.weather.servlet.SecurityUtil"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录</title>
</head>
<body>
<%
Cookie cookies[] = request.getCookies(); // 将适用目录下所有Cookie读入并存入cookies数组中
String userName = null;
String sign = null;
if (cookies != null) {
for (int i = 0; i < cookies.length; i++)
{
Cookie cookie = cookies[i];
out.println("cname="+cookie.getName()+" cvalue="+cookie.getValue()+"<br/>");
if (cookie.getName().equals("userName")) {
userName = cookie.getValue();
}
if (cookie.getName().equals("sign")) {
sign = cookie.getValue();
}
}
}
out.println("userName="+userName+" sign="+sign+"<br/>");
if (userName != null && sign != null) {
if (SecurityUtil.verify(userName, sign)) {
//System.out.println("login success from cookie");
request.getSession().setAttribute("user",userName);
}
}
if (request.getSession().getAttribute("user") == null) {
//this.getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);
} else {
%>
<h3>${user},欢迎您进入weather节点1应用</h3>
<br />
<a href="http://localhost:8080/weather2/main.jsp">节点2</a>
<%
}
%>
</body>
</html>
分享到:
相关推荐
### Exchange邮件系统单点登录整合知识点 #### 一、单点登录(Single Sign-On, SSO)概述 单点登录是一种认证机制,允许用户通过一次身份验证就能访问多个应用程序和服务,而无需重复登录。这种机制提高了用户体验...
用友U8开发单点登录方案 本文主要介绍了用友U8开发单点登录方案的设计背景、应用场景、实现方式和技术细节。单点登录方案的设计目标是实现非U8系统与U8系统的集成,共享用户名和密码,实现单点登录。 设计背景 ...
cas 单点登录解决方案 cas 单点登录解决方案是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。随着企业的发展,业务系统的数量...
JEECG单点登录集成文档(kisso集成)详细介绍了如何将Kisso单点登录解决方案集成到JEECG智能开发平台v3版本中。文档中提到了Kisso的基本概念和实现单点登录(SSO)的技术细节,具体包括服务端和客户端的集成步骤以及...
JEECG智能开发平台的单点登录(SSO)功能是通过集成Kisso实现的,Kisso是一个轻量级Java权限框架,它利用加密会话cookie机制来实现单点登录服务。单点登录是一种用户登录认证方法,允许用户在多个应用系统中,只通过...
然后,终端设备加入AD域后,AD域控服务器会往终端设备上安装一个脚本,这个脚本是来源于单点登录服务程序,所以终端的上下线等操作会通过域传给AD域控服务器,并且还会通过脚本将信息传递给单点登录服务程序,单点...
在本场景中,我们关注的是Jeecg如何配置单点登录(Single Sign-On,简称SSO)以及相关的登录验证代码。单点登录是一种网络应用架构中的安全机制,允许用户在一次登录后,就能访问多个相互关联的应用系统,而无需再次...
金蝶EAS portal单点登录到SHR文档 单点登录(Single Sign-On,SSO)是指用户只需要输入一次用户名和密码,即可访问多个相关的应用系统,而不需要再次输入登录信息。金蝶EAS portal单点登录到SHR文档提供了详细的...
单点登录(Single Sign-On,简称SSO)是一种网络用户身份验证机制,允许用户在一个系统或应用中登录后,无须再次输入凭证就能访问多个相互信任的系统或应用。在IT行业中,C#.NET框架提供了丰富的功能来实现跨域单点...
【K3单点登录二次开发指导文档】是针对金蝶K3系统中单点登录功能进行集成应用的技术文档,旨在帮助具有相应开发经验的人员理解并实现与K/3门户、K/3、K/3HR等应用系统的无缝对接。单点登录(Single Sign-On,SSO)是...
单点登录(Single Sign-On,简称SSO)是一种身份验证机制,允许用户在一次登录后访问多个相互关联的应用系统,而无需再次输入凭证。在Android端实现SSO,主要是为了确保用户在同一时间只能在一个设备上保持活跃的...
单点登录(Single Sign-On,简称SSO)是一种网络身份验证机制,允许用户在一个系统上登录后,无需再次提供凭证就能访问多个相互信任的系统。它简化了用户管理和提升了用户体验,因为用户不再需要记住多个密码或者在...
### 使用 CAS 实现 Mantis 单点登录与登出 #### 概述 单点登录(Single Sign-On,简称 SSO)是一种常见的身份认证模式,它允许用户在多个应用程序和服务中仅通过一次登录就能访问所有相关系统而无需多次输入密码。...
### nc63、nc65单点登录方案详解 #### 一、概述 单点登录(Single Sign-On,简称SSO)是一种用户只需要一次登录就能访问所有相互信任的应用系统的认证方式。这种机制不仅提升了用户体验,同时也提高了系统的安全性...
同时,该规范还对涉及的重要术语进行了明确的定义,比如单点登录、单点登录服务和单点登录票据等,以消除在不同应用场景中的歧义和误解。 四、单点登录服务逻辑与接口定义 规范中对单点登录服务的逻辑进行了详细的...
基于JWT实现SSO单点登录流程图解 基于JWT实现SSO单点登录流程图解是指使用JSON Web Token(JWT)来实现单点登录(SSO)的机制。在这种机制中,用户只需要登录一次,就可以访问多个应用服务器上的资源,而不需要再次...
在IT行业中,第三方单点登录(Third-party Single Sign-On,3SSO)是一种常见的身份验证解决方案,它允许用户通过一个中央认证系统访问多个相互独立的应用系统,而无需反复登录。"第三方单点登录Ecology方案"是针对...
在"springCloud-master_单点登录_springCloud单点登录_SpringCloud系统_springcloud eureka单点登录"这个项目中,我们将重点探讨如何在SpringCloud环境中实现单点登录(Single Sign-On,简称SSO)。 单点登录是一种...
Oracle单点登录(Single Sign-On, SSO)是一种身份验证机制,它允许用户在一次登录后访问多个相互关联的应用系统,而无需再次输入凭证。Oracle的SSO解决方案提供了企业级的安全性和便利性,大大提高了用户体验并降低...