Loginservlet
package sei.servlet;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import sei.dao.factory.DAOFactory;
import sei.vo.User;
import sei.vo.XmlDate;public class LoginServlet extends HttpServlet {
/**
 * 
 */
private static final long serialVersionUID = 1L; // 为客户端的get请求作响应
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 取得参数,用户名和密码
String userid=null;
String realname=null;
String username = req.getParameter("username");
String password = req.getParameter("password");
// 把参数打包成为对象
User user = new User();
user.setUserName(username);
user.setPassword(password);
// 调用对象,判断是否登陆成功
boolean isValidate = false;
int deptid = 0;
int accesslevel=0;
try {
isValidate = DAOFactory.getIUserDAOInstance().findLogin(user);
} catch (Exception e) {
e.printStackTrace();
}
// 要跳转到的页面
String forwardPage = "";
// 如果数据库有数据,返回true,则表示登录成功
if (isValidate) {
System.out.println("登录成功!--" + user.getUserName() + "----"
+ new XmlDate());
//
try {
// 重新得到user对象,覆盖原来的那个简单对象
user = DAOFactory.getIUserDAOInstance().findByName(username);
} catch (Exception e) {
e.printStackTrace();
}
// 这里写跳转代码,以及session设置
// 这个就是设置登录验证的了,每个需要验证的页面,只要先判断userid属性是否为空即可
// 其实应该是找出整个user的属性,必要的都加到session之中。session是一次回话。

// 这里判断该用户是否有效(因为只有当realname非空时才能确定该用户有效)
if (user.getRealName().equals("".trim())
|| null == user.getRealName()) {
System.out.println("该用户为空!");
// 要是真实姓名为空的话,那么就设置其用户名为realname
req.getSession().setAttribute("realname", user.getUserName());

// 如果真实姓名非空,那么证明该用户有效
} else {
System.out.println("该用户有效!");

// 这里声明Id2来获取不同角色的部门ID
Integer id2 = user.getNewsKindID();
// 这里声明accesslevel来得到登录用户的权限
accesslevel = user.getAccessLevel();
userid=user.getUserID();
realname=user.getRealName();

// 这里判断登录用户是不是记者,编辑,总编。
// 登录用户为记者
if (accesslevel == 1) {
System.out.println("记者您好!");
if (id2 != null) {
// 得到记者部门
deptid = user.getNewsKindID();
req.setAttribute("deptid", deptid);
// 跳转到记者页面
forwardPage = "author/author.jsp";
} else {
System.out.println("出错误了:用户部门为空");
}
}
// 登录用户是编辑
else if (accesslevel == 3) {
System.out.println("编辑您好!");
if (id2 != null) {
// 得到编辑部门
deptid = deptid + user.getNewsKindID();
req.setAttribute("deptid", deptid);
// 跳转到编辑页面
forwardPage = "editor/editor.jsp";
} else { System.out.println("出错误了:用户部门为空");
}
}
// 登录用户是总编
else {
if (id2 != null) {
//若是总编则直接跳转到总编页面
forwardPage = "chief/chiefeditor.jsp";
} else {
System.out.println("出错误了:用户部门为空");
}
}
} } else {
// 否则,就是登录失败
System.out.println("错误的用户名或密码!--" + new XmlDate());
// 这里写跳转代码,以及session设置
req.getSession().removeAttribute("realname");
req.getSession().removeAttribute("userid");
forwardPage = "failure.jsp";
} //
System.out.println("把权限放入会话" + new XmlDate());
req.getSession().setAttribute("accesslevel", accesslevel);
System.out.println("把姓名放入会话" + new XmlDate());
req.getSession().setAttribute("realname", realname);
System.out.println("把ID放入会话" + new XmlDate());
req.getSession().setAttribute("userid", userid);

req.getSession().setAttribute("user", user);
req.getRequestDispatcher(forwardPage).forward(req, resp); // 跳转
} protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 使用doGet,不再单独写代码
this.doGet(req, resp);
}}红字中的三个属性都存入属性中了
下面在转入到的一个JSP页面中<jsp:include>中包含的一个叫 userinfo2.jsp的页面中读取会话三个属性的代码<%!String userid = null;
String realname =null;
int accesslevel = 0;
String access = null;%>
<%
if (null != session.getAttribute("userid")) {
String userid = (String) session.getAttribute("userid"); } else {
System.out.println("userID为空");
}
//
if (null != session.getAttribute("realname")) {
String realname = (String) session.getAttribute("realname");
realname="笑";
} else {
System.out.println("realname为空");
}
if (null != session.getAttribute("accesslevel")) {
Integer accesslevel = (Integer) session
.getAttribute("accesslevel");
if (accesslevel == 1) {
    access = "记者";
} else if (accesslevel == 3) {
access = "编辑";
} else {
access = "总编";
}
} else {
System.out.println("accesslevel为空");
}对应的显示代码:
<tr class="STYLE10"valign="top" align="left">
<td align="left">
权限:
</td>
<td><%=access %></td>
</tr>
<tr class="STYLE10"valign="top" align="left">
<td align="left">
编号:
</td>
<td><%=userid %></td>
</tr>
<tr class="STYLE10"valign="top" align="left">
<td align="left">
姓名:
</td>
<td><%=realname %></td>
%>
用一个编辑的账号登录 读出来的效果如下:
权限:编辑
编号:null
姓名:null
郁闷~~~只能读出一个编辑。。求高手解答!

解决方案 »

  1.   


    req.getSession().setAttribute("userid", userid);
    req.getSession().setAttribute("user", user);
    你这样放进 session 中 是不是不对啊?这样放进去会不会覆盖掉之前的啊?Session session = req.getSession();
    session.setAttribute("userid", userid);
    session.setAttribute("user", user);
    你那个编辑能够出来的原因是你重新赋值了,并不是从session 中取到的值。access = "编辑";
      

  2.   

    这不是一个意思吗 这个做的是登录Servlet登录之前session为空,所以可以覆盖啊。。
    顺便解释一下 仔细看代码。。编辑 是 在得到accesslevel=3的时候才得到的
      

  3.   

    调试了半天 发现 JSP可以的得到 session的值 问题的症结在于,<%=userid %><%=realname %>
    得不到JSP得到的session值 而是直接把<!String userid=null;                                  String  realname=null;>取出 接下来解决这个问题。。
      

  4.   

    OK 把 <%=userid>改成<%=session.getAttribute("userid")>就好了 另一个也一样真奇怪为什么呢 难道不能<!userid=null;                       realname=null; >
    然后在逻辑里用变量userid=session.getAttribute("userid")然后<%=userid><%=realname>
    得到的两个值就是null难道是因为<!userid=null;                       realname=null; >中的null直接给<%=userid><%=realname>了?
    因为我试验过 在逻辑里userid=session.getAttribute("userid")这里的userid的确被赋值了,只是传递不到<%=userid>中那如果我说的成立 权限可以access得到怎么解释?虽然解决问题了 还是想探究其中的机理  坐等高人解答!
    另外还有个  String userid=(String)session.getAttribute("userid")和String userid=session.getAttribute("userid")得到相同的值 但这两个有什么区别呢??
    同样等高人解答!