您的位置:首页 > 其它

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

2016-08-24 15:14 295 查看
一、默认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值修改了,当第一个到了三秒后,就打印出已经被修改了的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息