Servlet&JSP的那些事儿(七)中我们介绍了会话管理,但是没有给出一个具体的实例。俗话说,耳听为虚眼见为实。所以,本篇讲述一个会话管理的实例。首先,建立一个web工程,LoginTest。建立的过程和之前MyDemo相同。不再赘述~LoginTest完成的主要功能为:开始时,这个程序采用基于cookie的会话更总,当客户端禁用cookie之后,采用URL重写的机制来进行会话跟踪。
首先编写一个工具类OutputSessionInfo。它有一个静态方法,该方法以表格形式输出session相关信息,方便我们随时查看。具体代码如下:
package com.shan.util;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class OutputSessionInfo{
public static void printSessionInfo (PrintWriter out,
HttpSession session) {
out.println("<table>");
out.println("<tr>");
out.println("<td>会话状态:</td>");
if(session.isNew()) {
out.println("<td>新的会话</td>");
} else {
out.println("<td>旧的会话</td>");
}
out.println("</tr>");
out.println("<tr>");
out.println("<td>会话ID:</td>");
out.println("<td>"+session.getId()+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>会话ID:</td>");
out.println("<td>"+session.getId()+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>创建时间:</td>");
out.println("<td>"+new Date(session.getCreationTime())+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>上次访问时间:</td>");
out.println("<td>"+new Date(session.getLastAccessedTime())+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>最大不活动时间间隔(s):</td>");
out.println("<td>"+session.getMaxInactiveInterval()+"</td>");
out.println("</tr>");
out.println("</table>");
}
}
然后,编写LoginServlet类。代码如下:
package com.shan.web;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.shan.util.OutputSessionInfo;
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
HttpSession session = request.getSession();
String user = (String)session.getAttribute("user");
out.println("<html>");
//告诉浏览器不要缓存这个页面
out.println("<meta http-equiv=\"Pragma\" content=\"no-cache\">");
out.println("<head><title>登录页面</title></head>");
out.println("<body>");
OutputSessionInfo.printSessionInfo(out,session);
out.println("<form method=post action=loginchk.do>");
out.println("<table>");
out.println("<tr>");
out.println("<td>请输入用户名:</td>");
if(user == null) {
out.println("<td><input type=text name=user></td>");
} else {
out.println("<td><input type=text name=user value="+user+"></td>");
}
out.println("</tr>");
out.println("<tr>");
out.println("<td>请输入密码:</td>");
out.println("<td><input type=password name=passwd></td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td><input type=reset value=重填></td>");
out.println("<td><input type=submit value=登录></td>");
out.println("</tr>");
out.println("</table>");
out.println("</form>");
out.println("</body>");
out.println("</html>");
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
doGet(request,response);
}
}
编写LoginchkServlet类,代码如下:
package com.shan.web;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class LoginchkServlet extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
String username = request.getParameter("user");
String passwd = request.getParameter("passwd");
if(username == null || passwd == null || username.equals("") || passwd.equals("")) {
response.sendRedirect("login.do");
} else {
HttpSession session = request.getSession();
session.setAttribute("user",username);
response.sendRedirect("welcome.do");
}
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException {
doGet(request,response);
}
}
编写WeclomeServlet类,代码如下:
package com.shan.web;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.shan.util.OutputSessionInfo;
public class WelcomeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
HttpSession session = request.getSession();
String user = (String)session.getAttribute("user");
if(user == null) {
response.sendRedirect("/login.do");
} else {
String username=request.getParameter("username");
String welcomeInfo="Hello, "+ username;
out.println("<html><head><title>");
out.println("欢迎页面");
out.println("</title></head>");
out.println("<body>");
OutputSessionInfo.printSessionInfo(out,session);
out.println("欢迎你,"+user);
out.println("<a href=login.do>重新登录</a>");
out.println("<a href=logout.do>注销登录</a>");
out.println("</body></html>");
out.close();
}
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
doGet(request,response);
}
}
编写LogoutServlet类,代码如下:
package com.shan.web;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class LogoutServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
HttpSession session = request.getSession();
session.invalidate();
out.println("<html><head><title>");
out.println("退出登录");
out.println("</title></head>");
out.println("<body>");
out.println("已退出登录");
out.println("<a href=login.do>重新登录</a>");
out.println("</body></html>");
out.close();
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
doGet(request,response);
}
}
最后,配置web.xml文件。如下:
<?xml version='1.0' encoding='utf-8'?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.shan.web.LoginServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>LoginchkServlet</servlet-name>
<servlet-class>com.shan.web.LoginchkServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>WelcomeServlet</servlet-name>
<servlet-class>com.shan.web.WelcomeServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>LogoutServlet</servlet-name>
<servlet-class>com.shan.web.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>LoginchkServlet</servlet-name>
<url-pattern>/loginchk.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>WelcomeServlet</servlet-name>
<url-pattern>/welcome.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>LogoutServlet</servlet-name>
<url-pattern>/logout.do</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>5</session-timeout>
</session-config>
</web-app>
完成后,还需要编译java文件。Dos环境下切换到工程所在目录,执行如下语句:
javac -classpath D:\apache-tomcat-7.0.33\lib\servlet-api.jar;classes -d classes src\com\shan\util\OutputSessionInfo.java
javac -classpath D:\apache-tomcat-7.0.33\lib\servlet-api.jar;classes -d classes src\\com\shan\web\LoginServlet.java
javac -classpath D:\apache-tomcat-7.0.33\lib\servlet-api.jar;classes -d classes src\\com\shan\web\LoginchkServlet.java
javac -classpath D:\apache-tomcat-7.0.33\lib\servlet-api.jar;classes -d classes src\\com\shan\web\WelcomeServlet.java
javac -classpath D:\apache-tomcat-7.0.33\lib\servlet-api.jar;classes -d classes src\\com\shan\web\LogoutServlet.java
最后,将编译好的文件拷贝到D:\apache-tomcat-7.0.33\webapps\LoginTest\WEB-INF\classes文件夹下,并把web.xml拷贝到D:\apache-tomcat-7.0.33\webapps\LoginTest\WEB-INF文件夹下。在Dos环境中执行startup,启动tomcat。运行结果如图1所示。
图1 实例的运行结果
可以禁用cookie,在IE或者chrome的设置中选择禁用cookie。然后就可以看到基于cookie的会话跟踪机制就失效了。这时,可以采用Servlet&JSP的那些事儿(七)所述的办法来解决上述问题。在此就不再细述,有兴趣可以自己添加,看看效果。
转载请注明出处:http://blog.csdn.net/iAm333