利用SESSIONID实现ASP和JSP的权限共享
本用例基于润乾非j2ee的web应用集成方案较老的版本更新,其基本实现思路不变。
为什么使用SESSIONID作为ASP和JSP的权限互通手段?因为SESSIONID的特性天然具有唯一性(排他性)和时效性。
我们知道,ASP通过IIS服务器运行,而JSP则通过J2EE服务器运行,如果使用SESSIONID作权限,则必然涉及到一个IIS服务器权限保留并能被JSP访问的问题。
SESSIONID的保留方式一般是两种,通过COOKIE或者通过数据。但是COOKIE是在客户端的,考虑到安全性和实时性问题,所以保留SESSION不采用该种方式而采用数据库方式。
SESSIONID从ASP传递向JSP应用时,需要做两件事情,第一件事情是将该SESSIONID入库,第二件事情是将该SESSIONID通过跳转传递到JSP应用的J2EE服务器。
存放SESSIONID的表结构如下:
CREATE TABLE [dbo].[session_tab](
[userid] [int] NOT NULL,
[username] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[password] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[sessionid] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[sessiontime] [int] NULL,
[logintime] [datetime] NULL,
CONSTRAINT [PK_session_tab] PRIMARY KEY CLUSTERED
[userid] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
整个DEMO的流程如下:ASP部分是验证用户的用户名和密码并设置sessionID的有效时间,验证通过后将数据插入SQLSERVER,同时页面跳转到JSP,J2EE服务器接管控制权,在JSP中,可根据ASP传递过来的SESSION ID查询数据库,取得相关的用户名、密码、SESSION有效时间。该例中的判断较简单,如果没有该SESSION,则跳转到IIS服务器的ASP登录页面,实际应用中可根据获得的SESSION建立时间和SESSION有效期来判断访问JSP时SESSION是否超时。
首先我们看ASP部分,login.aspx.cs中有一些关键代码,描述如下:
protected void Button1_Click(object sender, EventArgs e)
string strConnection = “Server=(local);database=AdventureWorks;uid=sa;pwd=3990225″;
SqlConnection myConnection = new SqlConnection(strConnection);
myConnection.Open();
string sql = “select count(*) from session_tab where username=’” + TextBox1.Text + “‘and password=’” + TextBox2.Text + “‘”;
SqlCommand myConmmand = new SqlCommand(sql, myConnection);
int flag = (int)myConmmand.ExecuteScalar();
if (flag > 0)
sql = “update session_tab set sessionid=’” + Session.SessionID + “‘, logintime = ‘”+ DateTime.Now+ “‘, sessiontime = ” + TextBox3.Text + “where username=’” + TextBox1.Text + “‘and password=’” + TextBox2.Text + “‘”;
Response.Write(sql);
myConmmand = new SqlCommand(sql, myConnection);
myConmmand.ExecuteNonQuery();
Response.Status = “301 Moved Permanently”;
Response.AddHeader(“Location”, “http://127.0.0.1:6001/demo/reportJsp/report.jsp?sessionid=” + Session.SessionID);
else
Response.Write(sql);
myConnection.Close();
ASP页面是事件驱动,我们在登录按钮的事件中,加入了连接数据库并根据用户输入获得结果的方法,如果用户验证通过,则记录下当前用户登录的SESSIONID和登录时间,后面两句关键代码
Response.Status = “301 Moved Permanently”;
Response.AddHeader(“Location”, “http://127.0.0.1:6001/demo/reportJsp/report.jsp?sessionid=” + Session.SessionID);
第一句是表明跳转时无需保存当前ASP的任何状态(唯一需要保留的SESSIONID已经存入了数据库中),第二句是ASP中的跳转方法,是定向到另一台服务器(J2EE服务器)上,并将本次登录的SESSIONID传递过去。
在J2EE端,有一个report.jsp页面和一个asp.raq文件。在jsp文件中,有如下关键代码:
String sessionid = request.getParameter( “sessionid” );
Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”).newInstance();
String url=”jdbc:sqlserver://127.0.0.1:1433;DatabaseName=AdventureWorks”;
String user=”sa”;
String password=”3990225″;
Connection conn= DriverManager.getConnection(url,user,password);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql=”select * from session_tab where sessionid = ‘”+ sessionid + “‘”;
ResultSet rs=stmt.executeQuery(sql);
String param =”";
if(rs.next()) {%>
用户ID为:<%=rs.getString(1)%>
用户名为:<%=rs.getString(2)%>
SessionID为:<%=rs.getString(4)%>
<%
out.print(“ASP和JSP互访成功,恭喜你\”);
rs.close();
stmt.close();
conn.close();
param = “sessionid=”+sessionid+”;”;
}else{
rs.close();
stmt.close();
conn.close();
response.sendRedirect(“http://localhost:53438/aspprj/login.aspx”);
}%>
根据传递过来的sessionid,JSP到数据库中查询有无该sessionid的记录,如果有,则在页面上显示该sessionid的用户名,用户ID和sessionid,如果没有,则重定向到ASP的登录页面,后面的报表标签无需赘述。
较简单的部署方法:建立数据库表和其中数据,将整个ASP应用在IIS上部署,将asp.raq放在润乾安装目录的reportfile目录下,将report.jsp放在showReport.jsp的同级目录,同时启动润乾报表和IIS,通过login.aspx访问登录即可。
具体例子见附件。