Servlet---默认Servlet/线程安全问题(网页串数据)

来源:互联网 发布:异地淘宝客服招聘 编辑:程序博客网 时间:2024/06/07 22:10

一、默认Servlet

默认Servlet,当请求的路径在web.xml中没有匹配上,那么就导向该servlet,避免客户端出现404这些找不到资源的错误。
注意,它可能会屏蔽掉我们放在安全目录以外的有效的资源(因为这些路径没有在web.xml中配置)
默认Servlet通过只会在项目正式发布时配置,测试阶段一般不会,因为我们无法看到具体的出错信息。

web.xml中要写上这几句

  <servlet>    <servlet-name>DefaultServlet</servlet-name>    <servlet-class>cn.hncu.servlets.DefaultServlet</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>DefaultServlet</servlet-name>    <url-pattern>/</url-pattern>  </servlet-mapping>
而这个DefaultServlet中的东西自然是随你自己了,如:

package cn.hncu.servlets;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class DefaultServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");out.println("<HTML>");out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");out.println("  <BODY>");out.println("<h1><font color='red'>404,找不页面,杯具啦!!!!</font></h1>");out.println("  </BODY>");out.println("</HTML>");out.flush();out.close();}}

二、网页串数据

(通过两个浏览器分别采用doGet方式发一个上传用户名的请求,即要在网址上输入信息) 输出结果,可会出现:第一个请求显示出的name是第二个请求上传的参数值。
下面模拟一下实现这种现象吧

代码如下:

package cn.hncu.servlets;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ThreadServlet extends HttpServlet {private String name=null;public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {name=request.getParameter("name");try {Thread.sleep(3000);//停三秒再响应} catch (InterruptedException e) {throw new RuntimeException(e);}response.getWriter().print("name="+name);}}
现象如下:




那么为什么会出现这种现象呢?

本例告诉我们,servlet在Tomcat中其实是单例,多个请求其实是共享servlet池中的同一个对象,因此该对象中的成员变量是共享的,容易出现串数据。尤其是servlet功能比较复杂的时候,可能会写多个方法,然后又要共用变量,很可能会想到把它定义成成员变量,这时就是一个坑!!!-----应该通过别的办法去解决,如通过方法参数传递,,数据库

本例中的name就是一个成员变量,第一个浏览器发送请求后停三秒的这段时间里,另一个浏览器发出了请求,于是将name值修改了,当第一个到了三秒后,就打印出已经被修改了的值。



0 0
原创粉丝点击