请求转发、重定向和session在登录例子中的运用(作者:张宗杰2012年2月5日)一、在web工程中有这么3个jsp页面,分别为login.jsp,query.jsp,update.jsp,作用分别是:login.jsp用于提供登录入口,登录成功后,普通用户和系统管理员都可以进行query.jsp页面的查询功能,而update.jsp页面的修改功能只有系统管理员可以使用。在这个案例中,用户不能非法的进入除了login.jsp的其他页面,即:必须经过login.jsp页面登录验证后才能访问其他几个页面或者servlet。web工程的jsp页面如下图所示(所有页面在网站的sessionTest目录中):二、login.jsp页面的布局如下图所示:HTML代码如下所示:%@pagelanguage=javacontentType=text/html;charset=UTF-8pageEncoding=UTF-8%!DOCTYPEhtmlPUBLIC-//W3C//DTDHTML4.01Transitional//EN=Content-Typecontent=text/html;charset=UTF-8title用户登录/titlestyletype=text/css#table_body{font-family:'宋体';font-size:12px;margin:auto;width:auto;height:auto;}.table_line{width:400px;height:30px;text-align:center;padding-top:5px;}.table_left{width:100px;height:35px;text-align:right;padding-top:5px;}.table_right{width:300px;height:35px;padding-left:3px;padding-top:5px;}/style/headbodyformmethod=postaction=doLoginname=login_formid=login_formtableborder=1cellpadding=0cellspacing=0id=table_bodytrtdcolspan=2class=table_line用户登录/td/trtrtdclass=table_left账号:/tdtdclass=table_rightinputtype=textname=userNameid=userName/td/trtrtdclass=table_left密码:/tdtdclass=table_rightinputtype=passwordname=passwordid=password/td/trtrtdclass=table_left权限:/tdtdclass=table_rightselectname=roleoptionvalue=1普通用户/optionoptionvalue=2系统管理员/option/select/td/trtrtdcolspan=2class=table_lineinputtype=submitname=btnid=btnvalue=登录/td/tr/table/form/body/html三、登录验证是通过login.jsp的action提交给doLogin这个servlet进行处理的。web.xml中对应该servlet的代码为:servlet的配置中,路径/sessionTest/表示login.jsp页面所在的位置,如果不加上的话会显示网页找不到,如果网页在根目录,就不用加了,或者在jsp页面中,用代码把网页的转向设置为根目录页就不用加了。四、doLogin这个servlet对应的java代码为DoLogin.java,由于登录成功后需要将用户的信息存储到session中,当其他页面需要使用的时候,直接从session中取出就可以了,本案例中,用户的属性有3个,分别是账号、密码和权限,在这里我们不再采用一个一个的存储到session中的方法,否则要写很多条session存储语句,其他页面调用的时候也不方便,我们可以建立一个存储用户属性的javabean,把javabean的对象存储到session中。用户属性的javabean的代码为User.java,具体代码为:packagecom.ajie.bean;publicclassUser{privateStringuserName;privateStringpassword;privateStringrole;publicStringgetUserName(){returnuserName;}publicvoidsetUserName(StringuserName){this.userName=userName;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}publicStringgetRole(){returnrole;}publicvoidsetRole(Stringrole){this.role=role;}}DoLogin.java的代码为:packagecom.ajie.servlet;importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;importcom.ajie.bean.User;/***用户登录*/@WebServlet(/DoLogin)publicclassDoLoginextendsHttpServlet{privatestaticfinallongserialVersionUID=1L;publicDoLogin(){super();}protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{this.doPost(request,response);}protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{StringuserName=request.getParameter(userName);Stringpassword=request.getParameter(password);Stringrole=request.getParameter(role);HttpSessionsession=request.getSession();Useruser=newUser();if(1.equals(role))//普通用户{if(ajie.equals(userName)&&10086.equals(password)){user.setUserName(userName);user.setPassword(password);user.setRole(role);session.setAttribute(user,user);System.out.println(登录成功);//测试用}else{//System.out.println(登录失败);//测试用}}elseif(2.equals(role))//超级管理员{if(admin.equals(userName)&&admin.equals(password)){user.setUserName(userName);user.setPassword(password);user.setRole(role);session.setAttribute(user,user);System.out.println(登录成功);//测试用}else{//System.out.println(登录失败);//测试用}}else//不存在的用户类型{//System.out.println(登录失败);//测试用}}}五、采用重定向的方法进行页面跳转。当我们登录失败以后,就要回到login.jsp页面中,并且以前输入的账号和权限选择必须存在。由于重定向采用的机制,如果返回login.jsp后,就不能从getParmater中获取存储的表单数据了,我们可以采用浏览器地址栏中跟上参数的形式,如:login.jsp?uid=+userName+&userRole=+role修改后servlet代码为:packagecom.ajie.servlet;importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;importcom.ajie.bean.User;/***用户登录*/@WebServlet(/DoLogin)publicclassDoLoginextendsHttpServlet{privatestaticfinallongserialVersionUID=1L;publicDoLogin(){super();}protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{this.doPost(request,response);}protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{StringuserName=request.getParameter(userName);Stringpassword=request.getParameter(password);Stringrole=request.getParameter(role);HttpSessionsession=request.getSession();Useruser=newUser();if(1.equals(role))//普通用户{if(ajie.equals(userName)&&10086.equals(