首先介绍以下Servlet的请求转发和重定向。请求转发和重定向都是Servlet的跳转技术
- 请求转发:
request.getRequestDispatcher("dispatcher.jsp").forward(request,response)
- 请求转发:
request.getRequestDispatcher("dispatcher.jsp").include(request,response)
- 重定向:
response.sendRedirect("redirect.jsp")
使用请求转发,转发到其他Servlet或者页面时,可以通过request.setAttribute()
和request.getAttribute()
来传递数据。需要注意的是,使用forward
方法的时候只会将request传递下去,而使用include
方法才会将request和response都传递下去。比如如下代码,只有在使用include方法的时候,才会在转发的页面当中显示hello world
//在dispatcher.jsp中不会显示hello world
request.getRequestDispatcher("dispatcher.jsp").forward(request,response);
response.getWriter().write("hello world");
//在dispatcher.jsp中会显示hello world
request.getRequestDispatcher("dispatcher.jsp").include(request,response);
response.getWriter().write("hello world");
使用重定向,转发到其他Servlet或者页面时,是真正的跳转,不再与之前的Servlet或者页面产生任何交互。
从方法的归属就可以看出,重定向是属于服务器响应的方法,而请求转发还是属于客户端的请求。
也就是说,重定向是一次请求一次响应,而请求转发是多次请求一次响应。
而怎样在使用重定向后,还能将数据传递下去呢,这时候就需要Session,在认识Session之前,需要先认识Cookie
HTTP是一个无状态的协议,当一个客户端向服务器发送完请求,服务器返回响应后,连接就关闭了,服务器端不再保留任何信息。那么当客户端发送多次请求且需要相同的请求参数时该怎么办,这时就应该使用Cookie技术。我们在页面中登陆某网站时,浏览器经常自动弹出用户名和密码,这就是使用Cookie技术后,保存在我们客户端本地的缓存信息,我们可以直接称这些信息为Cookie。
Cookie是一种在客户端保持HTTP状态信息的技术,是在浏览器访问服务器资源时,由服务器在响应头中传送给浏览器的数据。如果浏览器保存了这个Cookie,那么以后每次访问服务器时,都会在请求头中将Cookie传递给服务器。Cookie以key-value的形式记录信息。服务器可以给浏览器(就是客户端)发送多个Cookie,一个浏览器也可以存多个服务器的Cookie。
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("gbk");
//创建cookie
Cookie cookie1 = new Cookie("0000001", "beijing");
//将cookie放到响应头中,此时cookie只保存在浏览器中,是临时cookie,浏览器一关闭cookie就被清空了
response.addCookie(cookie1);
Cookie cookie2 = new Cookie("1234", "shanghai");
//使用这个方法来设置cookie在浏览器的保存时间,单位是秒,通过这种方式就可以实现一些登陆页面的x天内自动登陆的功能
///cookie2.setMaxAge(3*24*3600);
//以下方法可以对cookie的保存路径有个限制,这个方法有很好的应用,比如jd的cookie不能保存到taobao的页面当中
cookie2.setPath("/ServletLearning");
response.addCookie(cookie2);
//可通过request的方法获取cookie
Cookie[] cookies = request.getCookies();
if (cookies.length > 0) {
for (Cookie c :
cookies) {
System.out.println(c.getName() + ":" + c.getValue());
}
} else {
System.out.println("当前浏览器还没有cookie,如果在没有cookie的时候尝试获取cookie,会报空指针异常");
}
}
读者可打开浏览器的开发者工具观察Cookie
Session
当用户的不同请求需要用到同样的数据时,这时候就需要Session了,这是一个服务器端存储数据的技术。比如登陆了淘宝后,点击商品跳转到其他页面,这是我们还保持着登陆的状态而不需要重新登录,也就是说不同的请求,而服务器端却将我们的用户名密码记住了,这就是Session技术。下面话一个图,更直观地辨析一下Cookie和Session
Session表示会话,指一点时间内,用户与服务器的一系列交互操作。Session对象指的是用户发送不同请求的时候,在服务器端保存不同请求的共享数据的存储对象。
Session有几个特点
- Session技术依赖于Cookie技术
- Session由服务器端进行创建
- 每个用户独立拥有一个Session对象
- 每个Session对象默认生命时长30分钟
Session机制 :用户第一次向服务端发送请求,服务端接受到请求后,调用对应的Servlet处理,在处理过程中会给用户创建一个Session对象,用来存储用户请求中的公共数据,并将此session对象的JSESSIONID以key-value的形式在响应体中返回给浏览器(临时数据,浏览器关闭即丢失)。用户再次发起请求时,请求信息中会带有JSESSIONID,服务器接受到请求后,调用对应的Servlet进行处理,同时根据JSESSIONID找到对应的Session对象进行处理。
/**
* session作用:解决相同用户发送不同请求时的共享数据问题
* @author Song X.
* @date 2020/02/13
*/
public class SessionServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("gbk");
//获取session对象
HttpSession session = request.getSession();
//拿到JSESSIONID
System.out.println(session.getId());
//设置session的生命时长,单位是秒
// session.setMaxInactiveInterval(3);
//设置session强制失效,这样即使不关闭浏览器,每次请求也都是不同的JSESSIONID
// session.invalidate();
session.setAttribute("1", "hello world");
}
}
public class SessionServlet2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
String attribute = (String)session.getAttribute("1");
response.getWriter().write(attribute);
}
}
先运行SessionServlet,再运行SessionServlet2,会发现数据已经在不同的请求间传递了
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/20600.html