Java web JSP会话跟踪技术和Servlet基础

2、jsp的四种会话跟踪技术

Http协议是一种无状态协议,采用“连接-请求-应答-关闭连接”模式。

会话跟踪:客户端(浏览器)与服务器之间是通过HTTP协议进行通信的。从开发角度考虑,是使上一次请求所传递的数据能够维持状态到下一次请求,并可以辨别出是否相同的客户端所发送的请求。

会话跟踪:Cookie实现、Session实现、URL地址重写、隐藏表单域

Cookie

是一种客户端保持会话跟踪的解决方案。是指某些网站为了辨别用户身份而存储在用户端上的文本信息(通常经过加密)。Cookie不是内置对象,需要自己创建Cookie的实例。

作用:服务器在接收来自客户端浏览器的请求时,能够通过分析请求头的内容而得到客户端持有的信息,从而动态生成该客户端相对应的内容。

注:使用Cookie时,要保证浏览器接收Cookie。对IE浏览器设置方法是:选择浏览器的工具菜单->“隐私”->“高级”->"接受"选项。

Cookie cookie = new Cookie("键", "值");	//创建cookie
cookie.setMaxAge(60*60*24);				 //设置cookie有效期(单位:秒)一天
cookie.setPath("/");					 //设置cookie有效范围(路径),所有应用的访问路径
response.addCookie(cookie);				 //将cookie写入到客户端

session

是一种服务端保持会话跟踪的解决方案。每个用户都有一个唯一会话标识—SessionId,用户之间是不能共享的。

​ 服务器创建session对象时,会产生一个sessionID来标识session对象,sessionID会自动放入到Cookie中发送到客户端,知道下次访问,sessionID会发送到服务器,在服务器端通过sessionID进行不同的用户识别。

sessionID是依赖Cookie的,如果Cookie被禁用,那么session也将失效

session.setAttribute(string name, Object obj);	//往session里存信息
session.getAttribute(String name);				//通过键name获取信息
session.getMaxInactiveInterval(600);			//单位:秒;对于Tomcat容器默认:1800秒
session.removeAttribute(String name);			//通过键name移除session对象
session.invalidate();							//销毁session

销毁:1.session过期,默认是30分钟

​ 2.直接关闭Tomcat服务器

​ 3.直接调用session.invalidate();

URL地址重写

sessionID是依赖Cookie的,如果Cookie被禁用,session就不起作用。在cookie被禁用的时候就需要重写来解决问题。

String sessionId = request.getRequestedSessionId();     //获得sessionId
1、encodeURL()可以对任意URL进行重写
<a href="<%=response.encodeURL("index.jsp") %>">index页面</a>
2、encodeRedirectURL()方法主要对sendRedirect()方法的URL进行重写
encodeRedirect(response.encodeRedirectURL("EncodeURLServlet"));

该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会调用encodeURL()方法之后会自动将用户Session的id重写到URL中。重写后的输出可能是这样的:

a href="index.jsp?jsessionid=0E0C61100AEB06DE6A95EB1CD1DA8158">index页面</a>

隐藏表单域

通过<input type="hidden" name="userId" value="1101">进行信息的传递 。通过表单形式提交到服务器,但是本身不显示。

3、Servlet基础

Servlet API包含两个软件包:

  • javax.servlet包
  • javax.servlet.http包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ezf8nIXL-1600226451267)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20200915114920181.png)]

Servlet接口中主要方法

  • init(ServletConfig Config):Servlet初始化方法。ServletAPI规定对任何Servlet实例Init()方法只能被调用一次。
  • service(ServletRequest req, ServletResponse resp):Servlet的服务方法。ServletRequest参数提供访问请求数据的方法和字段;ServletResponse参数提供Servlet构造响应方法
  • destroy():Servlet的销毁方法;容器在终止Servlet服务前必须让Service()线程足够时间来结束执行;因此接口规定当service()正在执行时,destroy不被执行。
  • getServletConfig():让Servlet获得ServletConfig对象
  • getServletInfo():返回Servlet的信息

GenericServlet类

是一个抽象类,是Servlet接口的直接实现,提供除service方法之外其他有关Servlet生命周期的方法。

  • init(ServletConfig conf):若重写该方法,必须调用super.init(config),类的其他方法才能正常运行。
  • init(ServletConfig config):直接重载Servlet接口的init(Servlet config)方法就不需要调用super.init(config)而ServletConfig对象依然可以通过调用getServletConfig()方法获得。
  • service():是一个抽象方法,当执行网络请求继承这个类是必须实现它。
  • destroy():与Servlet接口的destroy()方法相同

HttpServlet类

指能够处理HTTP请求的Servlet,它在原有Servlet接口添加了对HTTP协议的处理。比Servlet接口的功能更加强大。

GenericServlet只可以编写一个基本的Servlet,HttpServlet可以处理HTTP请求的Servlet

  • Service(HttpServletRequest req, HttpServletResponse resp):重写service()方法,它会判断用户的请求方式;若GET请求,则调用HttpServlet的doGet()方法;若POST请求,则调用doPost()方法。
  • doGet():此方法被本类service()方法调用,用来处理一个HTTP GET操作
  • doPost():此方法被本类service()方法调用,用来处理一个HTTP POST操作
  • 超链接的GET请求会调用doGet()方法;form表单则根据请求方法来调用相对应的doGet()和doPost()方法

Servlet生命周期:加载和实例化、初始化、处理请求、销毁

七种状态转换关系:创建、初始化、服务可用、服务不可用、处理请求、终止服务、销毁

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-htUAndPI-1600226451270)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20200915222657700.png)]

service()方法可能被多次调用。当多个客户访问某个Servlet的service()方法时,服务器会为每个请求创建一个线程,这样可以并行处理多个请求,减少请求处理的等待时间,提高服务器的响应速度。对同一对象的并发访问问题

@WebServlet的属性及描述

属性名类型描述
nameStringServlet的名字
URLPatternsString[]是一组Servlet的URL的匹配模式
valueString[]URLPattern属性
loadOnStartupintServlet的加载顺序。
initParamWebInitParam[]一组Servlet初始化参数
asyncSupportedbooleanServlet是否支持异步操作模式,默认false
descripitonStringServlet的描述信息
displayNameStringServlet的显示名,通常配合工具使用

web.xml 中通过“< servlet> </ servlet>”元素声明Servlet

属性名类型描述
< descripiton>String指定Servlet的描述信息,等价于**@WebServlet的description**属性
< display-name>String指定Servlet的显示名,通常配合工具使用,等价于**@WebServlet的diasplayName**的属性
< servlet-name>String指定Servlet的名称,一般与Servlet的类名相同,要求web.xml文件名字唯一,等价于**@WebServlet的name**属性
< servlet-class>String指定Servlet类的全限定名,即包名.类名
< init-param>指定Servlet初始化参数,等价于**@WebServlet的initParams**属性,若有多个参数可重复定义此元素。
< param-name>String指定初始化参数名
< param-value>String指定初始化参数名对应的值
< load-on-startup>int指定Servlet的加载顺序,等价于**@WebServlet的LoadOnStartup**属性
< async-suppored>boolean指定Servlet是否支持异步操作模式,默认false,等价于**@WebServlet的asyncSupported**属性

web.xml中“< servlet-mapping> < /servlet-mapping>”指定Servlet的URL映射

属性名类型描述
< servlet-name>String指定要映射的Servlet名称,与< servlet>声明的< servlet-name>值一样
< url-pattern>String指定Servlet的URL匹配模式,等价于**@WebServlet的UrlPattern属性或value值**
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值