首页 > 编程 > .NET > 正文

让JSP与ASP.Net共享Session值

2024-07-10 12:54:59
字体:
来源:转载
供稿:网友
中国最大的web开发资源网站及技术社区,
    这个话题刚开始,我的思路是asp.net中序列化session以二进制数据保存到数据库,然后由jsp读取数据库中的二进制数据反序列化成session对象,再强制转化成java的session对象,在java端转换时,出现了错误,找遍网上的资料也没能解决,故采用一种替换的方式。

 替换的方式的思路:
    登录的aspx文件中,在登录成功后将session中的变量值保存到数据库中的一张表,关键字使用asp.net的session对象的sessionid, 然后建立一个aspx文件,取得当前登录用户的sessionid,并使用的asp.net重定向语句,转到jsp文件,该url请求的路径格式为 test.jsp?aspnetsessionid=ffj12d455p0ujr45vdqwhh45,如果asp.net没有登录或登录不成功,虽然有sessionid的值,但数据库中是没有该sessionid关联的数据可能有的读者发现,不用test.jsp?aspnetsessionid=ffj12d455p0ujr45vdqwhh45这样的请求的路径也可以完成,是的,可以用test.jsp?userid=1111这样的方式也传递值,当然userid是由asp.net登陆成功后,取得的值,但这样有些用户就可以知道userid(用户编号)这个敏感数据了。

 建立一张表

  table name:

   iis_session
   field name :
   id varchar(26) --存放asp.net的sessionid
   userid int(4) --存放登录成功后的用户编号
   power int(4) --存放用户的权限编号

  asp.net程序源码片段:

/*登录成功后,可将下列codeing放在登录的验证aspx页面中*/

//记录 session value 到数据库
private void writesession2db(string sessionid,string suid,string spwr)
{
  //连接数据库代码,读者自行添加
  string sessid = sessionid;
  string strsql = "insert into iis_session(id,userid,power) values(@seionid,@uid,@pwr)";

  //webmod.sqlconn是数据库的连接对象,读者自行替换成自己的数据库连接
  sqlcommand sqlcmd = new sqlcommand(strsql,webmod.sqlconn);
  sqlcmd.parameters.add("@seionid",sqldbtype.varchar).value = sessid;
  sqlcmd.parameters.add("@uid", sqldbtype.int ).value = convert.toint32(suid.trim());
  sqlcmd.parameters.add("@pwr", sqldbtype.int).value = convert.toint32(spwr.trim());
  sqlcmd.executenonquery();
  //关闭数据库连接,读者自行添加
}

/*当用户退出系统,将数据库中对应的sessionid的一行数据删除,可放在退出页面,或global.asax的session_end过程中*/

//删除数据库中的 session value
private void removesession4db()
{
  //连接数据库代码,读者自行添加
  string sessid = session.sessionid;
  string strsql = "delete from iis_session where id=’"+sessid+"’";

  //webmod.sqlconn是数据库的连接对象,读者自行替换成自己的数据库连接
  sqlcommand sqlcmd = new sqlcommand(strsql,webmod.sqlconn);
  sqlcmd.executenonquery();
  //关闭数据库连接,读者自行添加
}

/*一个重定向到jsp的aspx页面,在这个aspx页面的page_load中添加如下代码*/
private void page_load(object sender, system.eventargs e)
{
  string strsessionid = session.sessionid.trim();
  string strroot = "http://localhost/test.jsp?aspnetsessionid="+strsessionid;
  response.redirect(strroot,true);
}

  jsp程序源码片段:

<%@ page contenttype="text/html;charset=gb2312"%>
<%
/*
自己的数据库连接类,用户可以自己替换
*/
%>
<jsp:usebean id="db" scope="page" class="com.itbaby.bean.dbx.database"/>

<%

string saspnetsessionid=request.getparameter("aspnetsessionid");

//使用了连接池连接数据库,用户可以替换成自己的
string sdbsourcename="itbaby_dbpool";
db.dbconnopen(sdbsourcename);

string ssql="select userid,power from iis_session where id=’"+saspnetsessionid+"’";

//读者自己替换读出结果集的代码
java.sql.resultset rs=db.getrs(ssql);

if(rs.next())
{
  string suid = rs.getstring(1);
  string spower = rs.getstring(2);

  /*将数据库中对应的sessionid的值读出来,并显示,如果asp.net的session超时,将没有值*/
  out.print("<h1>asp.net session value userid = "+suid+"</h1><br><br>");
  out.print("<h1>asp.net session value power = "+spower+"</h1><br><br>");
}
rs.close();
db.dbconnclose();

%>

  好了,虽然不是很好的方法,但也可以用,也同样保护了用户的一些敏感数据,我将继续考虑使用序列化和反序列化的方式来达到不同的web语言之间共享session对象而不是上面的,共享session的值。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表