目录
response对象
简介
request内置对象主要的功能时进行用户请求的接收,即服务器要想接收到用户所发送的信息就使用request,而服务器端对客户端的回应信息就需要通过response完成。例如:“<%= %>”也是服务器对客户端的回应,服务器对客户端的回应是一种IO流的处理。response对应的类型:javax.servlet.HttpServletResponse,该接口定义如下:
public interface HttpServletResponse extends ServletResponse
发现该接口继承了javax.servlet.ServletResponse的父接口,显然该设计和request一样是为了日后的协议扩充使用的。
需要关注它的两个方法:
-
取得客户端输出字节流:public ServletOutputStream getOutputStream() throws IOException ;
-
取得客户端输出字符流:public PrintWriter getWriter() throws IOException ;
在实际开发中,response对象主要使用如下的三个操作:
-
设置头信息
-
请求重定向
-
Cookie操作
设置头信息
查看用户的头信息可以通过request查看:
-
取得所有头信息的名字:public Enumeration<String> getHeaderNames();
-
取得指定头信息的内容:public Enumeration<String> getHeaders(String name) ;
范例:取得用户头信息
<%@ page pageEncoding="UTF-8" %>
<%@ page import="java.util.*"%>
<%
Enumeration<String> enu = request.getHeaderNames() ;
while(enu.hasMoreElements()){
String headName = enu.nextElement() ;
%>
<h2><%= headName%>=<%= request.getHeader(headName) %> </h2>
<%
}
%>
头信息里面包含主机名称、连接状态、从那个页面跳转过来的(referer)、用户语言。
HttpServletResponse接口里面使用如下方法追加头信息:public void setHeader(String name, String value),可以设置一个自动刷新的头信息,用于定时跳转。
范例:定时跳转
<%@page pageEncoding="UTF-8"%>
<%
response.setHeader("refresh","2;url=get_header.jsp") ;
%>
<h1>你的XX操作成功,2秒后跳转.....</h1>
<h1>浏览器未跳转请点击<a href="get_header.jsp">跳转</a></h1>
请求重定向
在response对象里面由一个跳转指令:public void sendRedirect(String location) throws IOException ;
范例:跳转
<%@page pageEncoding="UTF-8"%>
<%
response.sendRedirect("get_header.jsp") ;
%>
跳转后地址发生了改变,属于客户端跳转;
JSP两种跳转之间的区别?
- 客户端跳转:地址会发生改变,并且不会传递request属性范围,页面代码执行完后才跳转;
\- 跳转方法:<a>、sendRedirect、window.location();
- 服务器端跳转:地址不会发生改变,会传递request属性范围,遇到跳转代码立即跳转;与数据库操作时需要注意关闭位置。
\-跳转方法:<jsp:forward page="路径"/>
Cookie处理
Cookie时服务器端存放到客户端的一些数据信息,例如:“记住密码”功能就是使用了Cookie。由于Cookie是保存在客户端的,所以安全性较差。
对Cookie进行操作需要使用到:javax.servlet.http.Cookie的处理类,该类中定义如下的处理方法:
- 构造方法:public Cookie(String name, String value);
- 取得Cookie名字:public String getName() ;
- 取得Cookie内容:public String getValue() ;
- 设置保存时间:public void setMaxAge(int expiry) ;
- 设置Cookie的保存路径:public void setPath(String uri) ;
通过response.addCookie(),保存Cookie;
范例:设置Cookie信息
<%@page pageEncoding="UTF-8"%>
<%
Cookie c1 = new Cookie("uname", "ren");
Cookie c2 = new Cookie("pass", "java") ;
response.addCookie(c1) ;
response.addCookie(c2) ;
%>
设置Cookie操作是由服务器端完成的,客户端的所有Cookie数据都是随客户端的头信息发送给服务端的,在request对象里面有一个取得全部Cookie信息的方法: public Cookie [] getCookie() ;
客户端只能保存当前浏览器中使用的Cookie,当浏览器关闭后Cookie就会消失,要想长久保存使用保存时间。还需要注意的是Cookie是默认在当前目录下使用的,则可以通过将Cookie的设置路径放在根目录下,使得整个的站点都可以使用Cookie。
范例:设置时间与路径
<%@page pageEncoding="UTF-8"%>
<%
Cookie c1 = new Cookie("uname", "ren");
Cookie c2 = new Cookie("pass", "java") ;
c1.setMaxAge(75) ; // 30 秒
c2.setMaxAge(57) ;
c2.setPath(request.getContextPath()) ;
response.addCookie(c1) ;
response.addCookie(c2) ;
%>
session内置对象
简介
每一个用户连接到服务器上,每个用户都会分配一块数据的保存空间,用来描述这个用户的信息,所以session=当前操作用户。session对象对应的类型是javax.servlet.http.HttpSession接口对像,并没有父类接口,即session只是属于http的协议范畴。
服务器端通过Session ID来区分不同用户的,如果说把服务器端连接的用户是一个Map的集合,那么Session ID就是key,用户数据就是value。Session ID是由Tomcat维护的,HttpSession接口里面提供有Session ID 的操作方法:public String getId() ;
需要注意以下两点:
-
用户只有关闭浏览器重新访问,Session ID才会被刷新。
-
用户在Cookie操作的时候有一个JSESSION的内容,是服务器端向客户端设置Cookie保存的就是Sessiong;
面试题:Session与Cookie关系如下:
重新设置Cookie会覆盖原来的JSESSION,使得访问时间更长。
登录注销
在实际的开发之中,session主要用于登录检测,主要的在于属性的操作:
设置属性:public void setAttribute(String name, Object value);
取得属性:public Object getAttribute(String name) ;
因为seesion属性在不管服务器端跳转还是客户端跳转都可以取得session设置的属性内容,即通过session能够取得属性表示你登录过,如果没有取得则表示没有登录过。
其中注销操作告诉服务器端该用户不在操作了,需要将服务器端该用户的Session ID清除,在HttpSession接口里面提供有一个注销的方法:public void invalidate()。
几乎所有的开发都会使用到登录注销,session属性范围一般只会保存用户名、权限。