- 浏览: 356922 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
fengxiatao:
忘了说我邮箱了 757723745@qq.com
关于 CAS SSO 文章声明 -
fengxiatao:
请发一下最github地址给我好吗?不胜感激
关于 CAS SSO 文章声明 -
romyli:
求一个github地址.感谢分享
关于 CAS SSO 文章声明 -
zz210891470:
使用您的例子从服务器获取lt返回test-login 页面之后 ...
CAS 之自定义登录页实践 -
feiteyizu:
WANTAWAY314 写道这种方法适合移动端的单点登录不?大 ...
CAS 之自定义登录页实践
最近因为公司另一款基于C/S的产品也需要整合到CAS 的 SSO,但是 CAS 本身对于客户端或浏览器而言是基于其COOKIE来存储用户(TGT)Ticket的,所以这时候就需要使用 CAS 的 RestFul API 来进行登录验证,并支持在C/S软件中点击用户头象时打开浏览器并跳转至用户中心,而且这时候在 WEB 上应该是已登录的状态(类似QQ点击自己的头象时,马上就进入到了QQ空间。)
关于CAS的登录验证流程,可以参考“CAS 之 实现用户注册后自动登录”,这里的RESTful登录验证流程与其大致相似,大体流程为:首先客户端提交用户名、密码、及Service三个参数,如果验证成功便返回用户的TGT(Ticket Granting Ticket)至客户端, 然后客户端再根据 TGT 获取用户的 ST(Service Ticket)来进行验证登录。 故名思意,TGT是用于生成一个新的Ticket(ST)的Ticket,而ST则是提供给客户端用于登录的Ticket,两者最大的区别在于,TGT是用户名密码验证成功之后所生成的Ticket,并且会保存在Server中及Cookie中,而ST则必须是是根据TGT来生成,主要用于登录,并且当登录成功之后 ST 则会失效。
CAS本身已经提供了 restlet 的集成包,如果你用的是 maven 的话直接加入,我这里的Cas-server的版本是 3.4.2.1:
然后再在 web.xml 中加入:
因为使用到了 Restlat 框架,所以还需要依赖几个 jar 包,分别是:
这几个jar已经打包在附件中了,另外 restlet.org 的 maven库中也有,需要的话可以去 maven.restlet.org 上找。
另外关于 restlet的配置在 cas-server中已经存在在: /WEB-INF/restlet-servlet.xml文件。
配置OK之后直接启动Server,下面来进行简单登录验证的测试:
1. 提交用户名密码及Service 进行登录验证
在以上Response信息及 Header中可以看到生成的 TGT,接下来是再重新根据 TGT 获取 ST,将请求的 URI 地址就是以上 Header中的 Location地址。
2. 根据返回的 TGT 来获取 ST
获取成功之后则返回了 ST,这时候对于客户端而言就已经拿到了登录的TIcket, 如果需要在Web中自动登录的话,只需要弹出浏览器,将ST作为 ticket参数传入即可。如,用户中心的后台地址首页是:http://www.google.com.hk/userCenter 则URL为: http://www.google.com.hk/userCenter?ticket=ST-3-9QkpLsFmCEqIXSVvGH9P-cas 并可进行登录。 当然前提是在该Web应用中需要部署cas-client应用。
3. 注销用户
Java代码调用示例:
参考:https://wiki.jasig.org/display/CASUM/RESTful+API
好像ST是有时效的,必须在短时间使用,超时就这个错误了
请问有解决吗
请教下,我的验证成功了,拿到Ticket了,可是用http://XX.com?ticket=ST-3-9QkpLsFmCEqIXSVvGH9P-cas 跳转过去后说票根无效,求解。
使用这种方式进行浏览器登录:
http://localhost:8090/console/?ticket=ST-21-qn0wsQN9VK0cQ1pfemW9-sso
我也觉得这里的方法是错误的,正如楼主在一开始自己说的,ST一旦验证过用户的身份是合法以后,ST就失效了,这里再带上ST去访问,肯定吃闭门羹啊。
关于CAS的登录验证流程,可以参考“CAS 之 实现用户注册后自动登录”,这里的RESTful登录验证流程与其大致相似,大体流程为:首先客户端提交用户名、密码、及Service三个参数,如果验证成功便返回用户的TGT(Ticket Granting Ticket)至客户端, 然后客户端再根据 TGT 获取用户的 ST(Service Ticket)来进行验证登录。 故名思意,TGT是用于生成一个新的Ticket(ST)的Ticket,而ST则是提供给客户端用于登录的Ticket,两者最大的区别在于,TGT是用户名密码验证成功之后所生成的Ticket,并且会保存在Server中及Cookie中,而ST则必须是是根据TGT来生成,主要用于登录,并且当登录成功之后 ST 则会失效。
CAS本身已经提供了 restlet 的集成包,如果你用的是 maven 的话直接加入,我这里的Cas-server的版本是 3.4.2.1:
<dependency> <groupId>org.jasig.cas</groupId> <artifactId>cas-server-integration-restlet</artifactId> <version>3.4.2.1</version> <type>jar</type> </dependency>
然后再在 web.xml 中加入:
<servlet> <servlet-name>restlet</servlet-name> <servlet-class>com.noelios.restlet.ext.spring.RestletFrameworkServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>restlet</servlet-name> <url-pattern>/v1/*</url-pattern> </servlet-mapping>
因为使用到了 Restlat 框架,所以还需要依赖几个 jar 包,分别是:
- com.noelios.restlet.ext.servlet.jar
- com.noelios.restlet.ext.spring-1.1.0.jar
- com.noelios.restlet.jar
- org.restlet-1.1.10.jar
- org.restlet.ext.spring-1.1.10.jar
这几个jar已经打包在附件中了,另外 restlet.org 的 maven库中也有,需要的话可以去 maven.restlet.org 上找。
另外关于 restlet的配置在 cas-server中已经存在在: /WEB-INF/restlet-servlet.xml文件。
配置OK之后直接启动Server,下面来进行简单登录验证的测试:
1. 提交用户名密码及Service 进行登录验证
DengerMacBook:cas-server denger$ curl -i -X POST -d "username=admin&password=123456&service=http://www.google.com" http://192.168.41.107:8080/member/v1/tickets/ HTTP/1.1 201 Created Date: Wed, 23 Mar 2011 12:42:52 GMT Location: http://192.168.41.107:8080/member/v1/tickets/TGT-14-gDOn9hhSYmq3xfeTRNhTAjZgOMdCdyuVNfsuLRs6onNv7fVmmX-cas Accept-Ranges: bytes Server: Noelios-Restlet-Engine/1.1.6 Content-Type: text/html;charset=ISO-8859-1 Content-Length: 437 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><head><title>201 The request has been fulfilled and resulted in a new resource being created</title></head><body><h1>TGT Created</h1><form action="http://192.168.41.107:8080/member/v1/tickets/TGT-14-gDOn9hhSYmq3xfeTRNhTAjZgOMdCdyuVNfsuLRs6onNv7fVmmX-cas" method="POST">Service:<input type="text" name="service" value=""><br><input type="submit" value="Submit"></form></body></html>
在以上Response信息及 Header中可以看到生成的 TGT,接下来是再重新根据 TGT 获取 ST,将请求的 URI 地址就是以上 Header中的 Location地址。
2. 根据返回的 TGT 来获取 ST
DengerMacBook:cas-server denger$ curl -i -X POST -d "service=http://www.google.com" http://192.168.41.107:8080/member/v1/tickets/TGT-14-gDOn9hhSYmq3xfeTRNhTAjZgOMdCdyuVNfsuLRs6onNv7fVmmX-cas HTTP/1.1 200 OK Date: Wed, 23 Mar 2011 12:48:03 GMT Accept-Ranges: bytes Server: Noelios-Restlet-Engine/1.1.6 Content-Type: text/plain;charset=ISO-8859-1 Content-Length: 29 ST-2-lJfQyJMMEnNGnKcglf1d-cas
获取成功之后则返回了 ST,这时候对于客户端而言就已经拿到了登录的TIcket, 如果需要在Web中自动登录的话,只需要弹出浏览器,将ST作为 ticket参数传入即可。如,用户中心的后台地址首页是:http://www.google.com.hk/userCenter 则URL为: http://www.google.com.hk/userCenter?ticket=ST-3-9QkpLsFmCEqIXSVvGH9P-cas 并可进行登录。 当然前提是在该Web应用中需要部署cas-client应用。
3. 注销用户
DengerMacBook:cas-server denger$ curl -i -X DELETE http://192.168.41.107:8080/member/v1/tickets/TGT-14-gDOn9hhSYmq3xfeTRNhTAjZgOMdCdyuVNfsuLRs6onNv7fVmmX-cas HTTP/1.1 200 OK Date: Wed, 23 Mar 2011 12:54:28 GMT Accept-Ranges: bytes Server: Noelios-Restlet-Engine/1.1.6 Content-Length: 0注销用户就很简单了,直接 SUBMIT DELETE 删除 TGT即可.
Java代码调用示例:
package cas; import java.io.IOException; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.PostMethod; public final class Client { private static final Logger LOG = Logger.getLogger(Client.class.getName()); private Client() { // static-only access } public static String getTicket(final String server, final String username, final String password, final String service) { notNull(server, "server must not be null"); notNull(username, "username must not be null"); notNull(password, "password must not be null"); notNull(service, "service must not be null"); return getServiceTicket(server, getTicketGrantingTicket(server, username, password), service); } private static String getServiceTicket(final String server, final String ticketGrantingTicket, final String service) { if (ticketGrantingTicket == null) return null; final HttpClient client = new HttpClient(); final PostMethod post = new PostMethod(server + "/" + ticketGrantingTicket); post.setRequestBody(new NameValuePair[] { new NameValuePair("service", service) }); try { client.executeMethod(post); final String response = post.getResponseBodyAsString(); switch (post.getStatusCode()) { case 200: return response; default: LOG.warning("Invalid response code (" + post.getStatusCode() + ") from CAS server!"); LOG.info("Response (1k): " + response.substring(0, Math.min(1024, response.length()))); break; } } catch (final IOException e) { LOG.warning(e.getMessage()); } finally { post.releaseConnection(); } return null; } private static String getTicketGrantingTicket(final String server, final String username, final String password) { final HttpClient client = new HttpClient(); final PostMethod post = new PostMethod(server); post.setRequestBody(new NameValuePair[] { new NameValuePair("username", username), new NameValuePair("password", password) }); try { client.executeMethod(post); final String response = post.getResponseBodyAsString(); switch (post.getStatusCode()) { case 201: { final Matcher matcher = Pattern.compile(".*action=\".*/(.*?)\".*") .matcher(response); if (matcher.matches()) return matcher.group(1); LOG .warning("Successful ticket granting request, but no ticket found!"); LOG.info("Response (1k): " + response.substring(0, Math.min(1024, response.length()))); break; } default: LOG.warning("Invalid response code (" + post.getStatusCode() + ") from CAS server!"); LOG.info("Response (1k): " + response.substring(0, Math.min(1024, response.length()))); break; } } catch (final IOException e) { LOG.warning(e.getMessage()); } finally { post.releaseConnection(); } return null; } private static void notNull(final Object object, final String message) { if (object == null) throw new IllegalArgumentException(message); } public static void main(final String[] args) { final String server = "http://192.168.41.107:8080/member/v1/tickets"; final String username = "admin"; final String password = "111111"; final String service = "http://localhost:8080/service"; LOG.info(getTicket(server, username, password, service)); } }
参考:https://wiki.jasig.org/display/CASUM/RESTful+API
- restlet.zip (457.7 KB)
- 下载次数: 1346
评论
21 楼
WANTAWAY314
2016-03-22
还有一个问题,ST是根据service生成的,需要把多个应用的service配置成一样的,才能实现一个ST在多个应用中登录? 但是service好像要跟各自应用的ip或者域名有关,生成的ST才可以登录
20 楼
WANTAWAY314
2016-03-22
你好。。。。。。如,用户中心的后台地址首页是:http://www.google.com.hk/userCenter 则URL为: http://www.google.com.hk/userCenter?ticket=ST-3-9QkpLsFmCEqIXSVvGH9P-cas 并可进行登录。。。。我获取到了tickets,直接按照你上面说的不行,但是浏览器上service?tickets=ST,可以转到目标地址,,,但是转向后才是 目标url?tickets=ST.........请问下这个是为什么
19 楼
飘渺青衣
2016-01-04
rryqsh123 写道
final String service = "http://localhost:8080/service"; 这是做什么用的?
还有ST也拿到了 但是按照 http://localhost:18080/CAS_BS_Client?ticket=ST-26-iYVAEuSwtaICMcmgbgts-cas01.example.org 登录报错
错误信息:
org.jasig.cas.client.validation.TicketValidationException:
绁ㄦ牴'ST-26-iYVAEuSwtaICMcmgbgts-cas01.example.org'涓嶇鍚堢洰鏍囨湇鍔?
还有ST也拿到了 但是按照 http://localhost:18080/CAS_BS_Client?ticket=ST-26-iYVAEuSwtaICMcmgbgts-cas01.example.org 登录报错
错误信息:
org.jasig.cas.client.validation.TicketValidationException:
绁ㄦ牴'ST-26-iYVAEuSwtaICMcmgbgts-cas01.example.org'涓嶇鍚堢洰鏍囨湇鍔?
好像ST是有时效的,必须在短时间使用,超时就这个错误了
18 楼
lysunki
2015-08-08
郑州蘑菇云 写道
你这个文章我看了,也试验成功能够进行登录了,虽然能够登录,但是进入其他系统的话还是需要跳转到cas认证中心的登录界面进行登录?这是怎么回事?
请问有解决吗
17 楼
郑州蘑菇云
2015-05-08
你这个文章我看了,也试验成功能够进行登录了,虽然能够登录,但是进入其他系统的话还是需要跳转到cas认证中心的登录界面进行登录?这是怎么回事?
16 楼
rryqsh123
2015-03-27
final String service = "http://localhost:8080/service"; 这是做什么用的?
还有ST也拿到了 但是按照 http://localhost:18080/CAS_BS_Client?ticket=ST-26-iYVAEuSwtaICMcmgbgts-cas01.example.org 登录报错
错误信息:
org.jasig.cas.client.validation.TicketValidationException:
绁ㄦ牴'ST-26-iYVAEuSwtaICMcmgbgts-cas01.example.org'涓嶇鍚堢洰鏍囨湇鍔?
还有ST也拿到了 但是按照 http://localhost:18080/CAS_BS_Client?ticket=ST-26-iYVAEuSwtaICMcmgbgts-cas01.example.org 登录报错
错误信息:
org.jasig.cas.client.validation.TicketValidationException:
绁ㄦ牴'ST-26-iYVAEuSwtaICMcmgbgts-cas01.example.org'涓嶇鍚堢洰鏍囨湇鍔?
15 楼
rryqsh123
2015-03-24
为什么返回404啊
14 楼
chenhbc
2014-10-06
hae 写道
经过无数次的失败终于搞定了
curl -i -X POST -d "username=admin&password=123456&service=http://www.google.com" http://192.168.41.107:8080/cas-server/v1/tickets/
楼主的这个命令也不说明下 害我搞了半天
大家要注意的是:
1: "username=admin&password=123456&service=http://www.google.com" 这个service大家随便写
2: http://192.168.41.107:8080/member/v1/tickets/ 这个memeber容易让人误解 member其实是你的CAS服务器,如
http://192.168.41.107:8080/文字cas-server/v1/tickets/ 这样写我相信大家会更明白点
curl -i -X POST -d "username=admin&password=123456&service=http://www.google.com" http://192.168.41.107:8080/cas-server/v1/tickets/
楼主的这个命令也不说明下 害我搞了半天
大家要注意的是:
1: "username=admin&password=123456&service=http://www.google.com" 这个service大家随便写
2: http://192.168.41.107:8080/member/v1/tickets/ 这个memeber容易让人误解 member其实是你的CAS服务器,如
http://192.168.41.107:8080/文字cas-server/v1/tickets/ 这样写我相信大家会更明白点
请教下,我的验证成功了,拿到Ticket了,可是用http://XX.com?ticket=ST-3-9QkpLsFmCEqIXSVvGH9P-cas 跳转过去后说票根无效,求解。
13 楼
renlei413326889
2014-09-18
感谢博主,您的一系列文章都很有价值~~
12 楼
dphenixiong
2014-08-07
带上ST后,无效,ST无法识别....
11 楼
冬天秋天
2014-07-10
magic_wz 写道
请问,我拿到里ST之后,怎么登录不了?
使用这种方式进行浏览器登录:
http://localhost:8090/console/?ticket=ST-21-qn0wsQN9VK0cQ1pfemW9-sso
10 楼
冬天秋天
2014-07-10
获取ST之后点击链接可以打开浏览器并进行登录,但是浏览器中也有退出登录的按钮,如何在浏览器中获取TGT,完成REST 方式的退出登录呢?
9 楼
magic_wz
2014-01-07
请问,我拿到里ST之后,怎么登录不了?
8 楼
glassesbamboo
2013-12-23
xiaokang1582830 写道
获取成功之后则返回了 ST,这时候对于客户端而言就已经拿到了登录的TIcket, 如果需要在Web中自动登录的话,只需要弹出浏览器,将ST作为 ticket参数传入即可。如,用户中心的后台地址首页是:http://www.google.com.hk/userCenter 则URL为: http://www.google.com.hk/userCenter?ticket=ST-3-9QkpLsFmCEqIXSVvGH9P-cas 并可进行登录?登录时总是提示票根无效
我也觉得这里的方法是错误的,正如楼主在一开始自己说的,ST一旦验证过用户的身份是合法以后,ST就失效了,这里再带上ST去访问,肯定吃闭门羹啊。
7 楼
chengtianfei
2013-12-05
service=http://www.google.com
这个service 可以随便写吗,我配置了一个service 他就只能访问这一个,其它的都包错误说票据无效,其它的系统都实现了cas 的客户端,有人回答一下原因吗?
这个service 可以随便写吗,我配置了一个service 他就只能访问这一个,其它的都包错误说票据无效,其它的系统都实现了cas 的客户端,有人回答一下原因吗?
6 楼
hae
2013-08-14
hae 写道
经过无数次的失败终于搞定了
curl -i -X POST -d "username=admin&password=123456&service=http://www.google.com" http://192.168.41.107:8080/cas-server/v1/tickets/
楼主的这个命令也不说明下 害我搞了半天
大家要注意的是:
1: "username=admin&password=123456&service=http://www.google.com" 这个service大家随便写
2: http://192.168.41.107:8080/member/v1/tickets/ 这个memeber容易让人误解 member其实是你的CAS服务器,如
http://192.168.41.107:8080/cas-server/v1/tickets/ 这样写我相信大家会更明白点
curl -i -X POST -d "username=admin&password=123456&service=http://www.google.com" http://192.168.41.107:8080/cas-server/v1/tickets/
楼主的这个命令也不说明下 害我搞了半天
大家要注意的是:
1: "username=admin&password=123456&service=http://www.google.com" 这个service大家随便写
2: http://192.168.41.107:8080/member/v1/tickets/ 这个memeber容易让人误解 member其实是你的CAS服务器,如
http://192.168.41.107:8080/cas-server/v1/tickets/ 这样写我相信大家会更明白点
5 楼
hae
2013-08-14
经过无数次的失败终于搞定了
curl -i -X POST -d "username=admin&password=123456&service=http://www.google.com" http://192.168.41.107:8080/cas-server/v1/tickets/
楼主的这个命令也不说明下 害我搞了半天
大家要注意的是:
1: "username=admin&password=123456&service=http://www.google.com" 这个service大家随便写
2: http://192.168.41.107:8080/member/v1/tickets/ 这个memeber容易让人误解 member其实是你的CAS服务器,如
http://192.168.41.107:8080/文字cas-server/v1/tickets/ 这样写我相信大家会更明白点
curl -i -X POST -d "username=admin&password=123456&service=http://www.google.com" http://192.168.41.107:8080/cas-server/v1/tickets/
楼主的这个命令也不说明下 害我搞了半天
大家要注意的是:
1: "username=admin&password=123456&service=http://www.google.com" 这个service大家随便写
2: http://192.168.41.107:8080/member/v1/tickets/ 这个memeber容易让人误解 member其实是你的CAS服务器,如
http://192.168.41.107:8080/文字cas-server/v1/tickets/ 这样写我相信大家会更明白点
4 楼
bmwcyq520
2013-08-08
为什么我的返回结果集里面没有这一行呢?
Location: http://192.168.41.107:8080/member/v1/tickets/TGT-14-gDOn9hhSYmq3xfeTRNhTAjZgOMdCdyuVNfsuLRs6onNv7fVmmX-cas
Location: http://192.168.41.107:8080/member/v1/tickets/TGT-14-gDOn9hhSYmq3xfeTRNhTAjZgOMdCdyuVNfsuLRs6onNv7fVmmX-cas
3 楼
bmwcyq520
2013-08-07
我怎么返回的是404,是不是需要在restlet-servlet.xml配置什么啊?
2 楼
fogu
2013-03-07
我访问v1/tickets的时候,返回的是200码,debug的时候发现代码去跳转访问/cas/login接口了,访问完了以后就传回200了,而不是希望的201 create,不知道是什么原因,我用户名和密码也已经传递过去了
发表评论
-
关于 CAS SSO 文章声明
2015-03-21 14:39 3063由于几年前写了几篇 CAS 系列的文章,之后陆续有人参照文章去 ... -
CAS 之 跨域 Ajax 登录实践
2011-07-08 01:36 27353因最近经常有时候被一些朋友问到关于 CAS 跨全域下的 Aja ... -
新浪微博如何实现 SSO 的分析
2011-05-10 14:44 24618最近在使用sina微博时,经常性交替使用 weibo ... -
淘宝如何跨域获取Cookie分析
2011-04-13 10:39 20291Move to: http://www.iteye.com/t ... -
CAS 之自定义登录页实践
2010-11-11 20:03 826101. 动机 用过 CAS 的人都知道 CAS-S ... -
CAS 之 实现用户注册后自动登录
2010-11-08 16:22 185091. 关于CAS的介绍不再累述,我想涉及过SSO同学 ...
相关推荐
工程代码基于STM32F103C8T6,使用PWM输出驱动电机,电机驱动使用TB6612,通过按键控制电机速度,并且速度通过OLED显示屏进行显示 使用到的硬件:STM32F103C8T6最小系统板,四针脚OLED显示屏,直流电机,按键,TB6612电机驱动模块
最新微信文章编辑器排版工具程序源码.rar最新微信文章编辑器排版工具程序源码.rar最新微信文章编辑器排版工具程序源码.rar
这个压缩包 "netctossconformity.rar" 包含了一套电信计费系统的完整代码,它是针对计算机专业学生或开发者的JSP源码资料。这套系统的设计旨在为电信运营商提供一个可靠、高效的计费解决方案。通常,这种系统会涉及到用户账户管理、费用计算、账单生成、支付处理以及数据报告等功能模块。在内容上,该资料包可能包括了前端用户界面和后端服务器逻辑的源代码,使用JSP(Java Server Pages)技术实现。前端可能会涵盖用户注册、登录、查看账单和支付历史等操作的用户界面,而后端则包含数据库交互、计费算法、用户验证和安全性措施等关键功能。对于学习者来说,这个资料包是一个宝贵的实践资源,可以帮助他们理解电信计费系统的工作原理,以及如何运用JSP技术开发复杂的商业应用。通过分析这些代码,可以加深对Java Web技术栈的理解,包括但不限于Servlet API、JDBC(Java Database Connectivity)、HTML/CSS/JavaScript,以及可能涉及的框架如Spring或Struts。此外,这个资料包也可能含有一些文档,例如系统设计说明、代码结构介绍、部
交流电桥实验(95).zip
优秀源码设计,详情请查看资源内容
MRU3-2保护技术简化电压继电器对称分量评估 MRU3-2保护技术简单电压继电器,具有对称分量评估功能
图3-7.zip
基于matlab开发的多元散射校正和变量标准化Matlab处理程序,可以对建模前的原始数据进行校正、处理.rar
新建 文本文档.txt
最新获取QQ微信头像橘头像阁PHP源码下载.rar最新获取QQ微信头像橘头像阁PHP源码下载.rar
3D模型004,可用于建模、GIS、BIM、CIM学习
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
在当今的Web开发中,实时监控服务器性能是至关重要的。其中,动态显示JSP服务器内存的Ajax程序图像版_systemjc.rar是一个为开发者和系统管理员提供便利的计算机专业JSP源码资料包。这个资料包的核心是一个高效的Ajax程序,它能够实时获取并展示JSP服务器的内存使用情况。通过使用这一工具,用户可以在一个直观的界面上看到服务器内存的使用率、已使用内存、可用内存等关键信息,而这一切都无需刷新页面。这得益于Ajax技术的强大功能,它允许在后台与服务器进行异步通信,从而获取最新的数据并更新前端界面。这个资料包不仅包含了完整的源代码,还提供了详细的文档和注释,使得即使是初级的JSP开发者也能够轻松地部署和使用。此外,它的图像版设计使得数据的展示更加直观和友好,帮助用户快速识别任何潜在的问题。总的来说,动态显示JSP服务器内存的Ajax程序图像版_systemjc.rar是一个强大、实用且易于使用的JSP源码资料包,它为实时监控服务器性能提供了一个有效的解决方案。重新回答||
Sora AI,作为OpenAI继ChatGPT之后的又一重磅力作,以其独特的文本到视频模型技术,在AI内容创作领域掀起了一场革命性的风暴。本文将详细探讨Sora AI的技术特点、应用场景以及未来发展趋势,展现其在视频制作、广告、教育和娱乐产业中的巨大潜力。 Sora AI作为OpenAI的又一力作,以其独特的文本到视频模型技术引领了AI视频生成技术的新潮流。通过深入了解Sora AI的技术特点、应用场景和未来发展趋势,我们可以看到它在视频制作、广告、教育和娱乐产业中的巨大潜力和广阔前景。然而,我们也应清醒地认识到,技术的发展总是伴随着挑战和问题,只有不断探索和解决这些问题,才能让Sora AI更好地服务于人类社会。
NTsky新闻发布系统 v1.0稳定版_18655.rar是一款专为计算机专业人士设计的JSP源码资料包。这款资料包的主要功能是帮助用户快速、高效地管理和发布新闻信息。它采用了先进的JSP技术,结合了数据库管理系统,使得新闻的发布和管理变得简单而直观。该资料包包含了完整的源代码,用户可以根据自己的需求进行修改和优化。同时,它还提供了详细的使用说明和技术文档,即使是对JSP技术不太熟悉的用户,也能快速上手。此外,该资料包还具有良好的用户界面设计,使得操作更加人性化。NTsky新闻发布系统 v1.0稳定版_18655.rar的另一个优点是其稳定性。经过多次测试和优化,该系统已经达到了稳定运行的状态,可以满足用户在各种环境下的使用需求。无论是在个人电脑上,还是在服务器上,都能稳定运行。总的来说,NTsky新闻发布系统 v1.0稳定版_18655.rar是一款功能强大、操作简便、稳定性高的JSP源码资料包。无论是对于专业的计算机人士,还是对于初学者,都是一个很好的学习和使用工具。重新回答||
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
此次开发的是一款在线的租房管理系统,该系统从功能上来看,应该具备以下模块: (1)房源信息模块:房源信息展示、房源信息更新、房源信息增加、房源信息删除; (2)账户管理模块:账户登录、账户绑定、账户管理; (3)租金结算模块:每月租金信息、租金交付功能、月租金收入总额统计; (4)房屋租赁合同管理模块:房屋租赁合同录入、房屋租赁合同展示、房屋租赁价格修改、房屋租赁合同终止; (5)报障模块:租客报账、管理员报障审核、租客报障统计; (6)日程模块:收租日程显示; 从角色的需求上来划分,应当具有三个角色要素,分别为租客、出租方以及管理员三个角色,租客能够实现在线的查看房源,申请租房,签订租赁合同以及租金每月支付等功能。房东应当可以实现租金收入的统计,租赁合同的展示以及租赁价格的修改等。管理员能够通过后台的管理对网站信息进行常规化的管理操作。 通过SSM框架技术搭建在线租房网站,能够实现出租方在线登记房源信息,租赁方能够在线查看消息,并在线与出租人进行沟通,可以实现在线租房申请。后台的管理员能够通过管理手段来对整个系统进行维护和管理。
机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。它专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。机器学习是人工智能的核心,是使计算机具有智能的根本途径。 机器学习的发展历程可以追溯到20世纪50年代,当时Arthur Samuel在IBM开发了第一个自我学习程序,一个西洋棋程序,这标志着机器学习的起步。随后,Frank Rosenblatt发明了第一个人工神经网络模型——感知机。在接下来的几十年里,机器学习领域取得了许多重要的进展,包括最近邻算法、决策树、随机森林、深度学习等算法和技术的发展。 机器学习有着广泛的应用场景,如自然语言处理、物体识别和智能驾驶、市场营销和个性化推荐等。通过分析大量的数据,机器学习可以帮助我们更好地理解和解决各种复杂的问题。例如,在自然语言处理领域,机器学习技术可以实现机器翻译、语音识别、文本分类和情感分析等功能;在物体识别和智能驾驶领域,机器学习可以通过训练模型来识别图像和视频中的物体,并实现智能驾驶等功能;在市场营销领域,机器学习可以帮助企业分析用户的购买行为和偏好,提供个性化的产品推荐和定制化的营销策略。 总的来说,机器学习是一个快速发展且充满潜力的领域,它正在不断地改变我们的生活和工作方式。随着技术的不断进步和应用场景的不断扩展,相信机器学习将会在未来发挥更加重要的作用。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
最新UI站长引流工具箱 带后台+安装说明.rar最新UI站长引流工具箱 带后台+安装说明.rar最新UI站长引流工具箱 带后台+安装说明.rar