Servlet---默认Servlet/线程安全问题(网页串数据)
2016-08-24 15:14
295 查看
一、默认Servlet
默认Servlet,当请求的路径在web.xml中没有匹配上,那么就导向该servlet,避免客户端出现404这些找不到资源的错误。
注意,它可能会屏蔽掉我们放在安全目录以外的有效的资源(因为这些路径没有在web.xml中配置)
默认Servlet通过只会在项目正式发布时配置,测试阶段一般不会,因为我们无法看到具体的出错信息。
web.xml中要写上这几句
二、网页串数据
(通过两个浏览器分别采用doGet方式发一个上传用户名的请求,即要在网址上输入信息) 输出结果,可会出现:第一个请求显示出的name是第二个请求上传的参数值。
下面模拟一下实现这种现象吧
代码如下:
那么为什么会出现这种现象呢?
本例告诉我们,servlet在Tomcat中其实是单例,多个请求其实是共享servlet池中的同一个对象,因此该对象中的成员变量是共享的,容易出现串数据。尤其是servlet功能比较复杂的时候,可能会写多个方法,然后又要共用变量,很可能会想到把它定义成成员变量,这时就是一个坑!!!-----应该通过别的办法去解决,如通过方法参数传递,,数据库
本例中的name就是一个成员变量,第一个浏览器发送请求后停三秒的这段时间里,另一个浏览器发出了请求,于是将name值修改了,当第一个到了三秒后,就打印出已经被修改了的值。
默认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值修改了,当第一个到了三秒后,就打印出已经被修改了的值。
相关文章推荐
- Jsp servlet页面数据乱码问题解决(默认mysql数据库)
- servlet线程安全问题
- 网页刷新的问题。避免数据重复提交。
- servlet线程安全问题分析
- servlet与Struts action线程安全问题分析
- servlet线程安全问题
- 用GET/POST方法向Servlet传送中文数据的问题。
- 用python进行分布式网页数据抓取(二)—— 核心问题讨论
- 网页文件上传问题—servlet实现
- servlet与Struts action线程安全问题
- 线程安全问题(解决) -------使用spring 的action-servlet.xml解决struts线程问题
- servlet与Struts action线程安全问题分析!
- 关于servlet线程安全问题
- 网页中的数据导出问题(word文档等格式)
- Ext2.2使用Iframe显示网页无法打开的问题或者不显示数据问题
- servlet读取表单数据和返回页面时的中文乱码问题
- servlet与Struts action线程安全问题分析
- [recv][网页][数据]recv到网页数据的查找问题
- servlet与Struts action线程安全问题分析
- servlet线程安全问题