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的属性及描述
属性名 | 类型 | 描述 |
---|---|---|
name | String | Servlet的名字 |
URLPatterns | String[] | 是一组Servlet的URL的匹配模式 |
value | String[] | URLPattern属性 |
loadOnStartup | int | Servlet的加载顺序。 |
initParam | WebInitParam[] | 一组Servlet初始化参数 |
asyncSupported | boolean | Servlet是否支持异步操作模式,默认false |
descripiton | String | Servlet的描述信息 |
displayName | String | Servlet的显示名,通常配合工具使用 |
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值** |