关于request的getSession()、response的encodeRedirectURL(String url) 和encodeURL(String url)

本文解析了Tomcat中URL重写的工作原理,特别是encodeURL和encodeRedirectURL方法的行为。通过实例展示了浏览器支持和不支持cookie时,Tomcat如何处理session ID。

 

  关于encodeRedirectURL (String  url) encodeURL (String  url):

 

  tomcat没有从客户端的cookie中得到sessionId,调用此方法,做的事情是将sessionId放到url尾部,条件是此时tomcat持有当前session的sessionId。其实 tomcat不会知道浏览器是否支持 cookie,所以tomcat并不会根据这一点才判断是否需要进行url重写,所以 encodeURL该方法的做法很简单:假如有sessionId,且不是从cookie中获得的,就放到url尾部,否则直接返回原url。

 

 

 

tomcat可以在context配置中配置session机制使用不cookie与否,默认情况下是使用。

 

当tomcat配置开启cookie时

1.当浏览器开启cookie时

   (1)当客户端清除所有cookie之后,访问该servlet(模拟客户的第一次访问):

        response.addCookie(new Cookie("popo","nothing"));

        request.getSession(true);  //创建了一个session,当然同时有sessionId;同时addCookie(JSessionId,sessionId)
        String url = response.encodeURL("test.jsp");  //因为tomcat没有从head的cookie中得到sessionId,所以认为浏览器可能不支持cookie,所以就进行url重写
        response.getWriter().write(url);  //输出test.jsp?sessionId=XXXX

 

   (2)客户端再次刷新(有cookie发送给tomcat了,包括sessionId和popo):

        response.addCookie(new Cookie("nothing","popo"));

        request.getSession(true);  //从Map<sessionId,session>中取到session
        String url = response.encodeURL("test.jsp");  //因为tomcat从head的cookie中得到sessionId,所以认为浏览器支持cookie,所以就不进行url重写
        response.getWriter().write(url);  //输出test.jsp

 

   (3)将cookie中的sessionId清除,即客户端有cookie发给tomcat,但是没有sessionId:(验证“因为tomcat从head的cookie中得到sessionId,所以认为浏览器支持cookie,所以就不进行url重写”这这句话是否正确。即验证tomcat是根据cookie存在与否,还是根据cookie中的sessionId存在与否,去决定是否重写URL)

        response.addCookie(new Cookie("nothing","popo"));

        request.getSession(true);  //创建了一个session,当然同时有sessionId;同时addCookie(JSessionId,sessionId)
        String url = response.encodeURL("test.jsp");  //因为tomcat没有从head的cookie中得到sessionId,所以认为浏览器可能不支持cookie,所以就进行url重写
        response.getWriter().write(url);  //输出test.jsp?sessionId=XXXX

       结论:encodeURL和encodeRedirectURL是根据cookie中是否存在sessionId,去决定做不做url重写的。

 

  (4)

   1。 tomcat重启,浏览器清除cookie,访问http://localhost:8080/jquery/jsp/login.do;jsessionid=73E538E6857AB6EB68037E6016E02ECA (tomcat仍然存有该sessionid的session)

      此时

        response.addCookie(new Cookie("popo","nothing"));

        request.getSession(true);  //找到session;当然没有addCookie
        String url = response.encodeURL("test.jsp");  //因为tomcat是从URL中得到sessionId,所以认为浏览器可能不支持cookie,所以就进行url重写

        response.getWriter().write(url);  //输出test.jsp?jsessionId=73E538E6857AB6EB68037E6016E02ECA

 

  2。 tomcat重启,浏览器清除cookie,访问http://localhost:8080/jquery/jsp/login.do;jsessionid=73E538E6857AB6EB68037E6016E02EEE  (tomcat中不存在的sessionid)

      此时

        response.addCookie(new Cookie("popo","nothing"));

        request.getSession(true);  //找不到session,所以创建了一个session;进行 addCookie(JSessionId,sessionId)
        String url = response.encodeURL("test.jsp");  //因为tomcat没有从head的cookie中得到sessionId,所以认为浏览器可能不支持cookie,所以就进行url重写

        response.getWriter().write(url);//输出test.jsp?jsessionId=F25086842E259B0F35F8EA19CCE89DB2

 

 

 

 

 

 

现在要进行一个实验:实验二 Servlet进阶JSP基础 一、实验目的 (1)掌握Servlet处理session以及Cookie的方法。 (2)掌握JSP的编写方法。 (3)掌握JSP中变量、表达式的使用。 二、 实验环境要求 (1)使用Eclipse、Tomcat以及浏览器等作为实验环境。 (2)实验前应做好设计规划,充分准备,对各个问题预先编制程序。 (3)在实验中遇到困难时运用多种手段解决问题。 三、 实验内容 (1) 使用表单提交的方式交给Servlet处理,完成用户登录以及退出操作,并利用会话Cookie实现自动登录功能。我创建了一个login.jsp,代码为:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <% String username = ""; String password = ""; Cookie[] cookies = request.getCookies(); if(cookies!= null){ String userinfo = null; for(int i=0;i<cookies.length;i++){ if(cookies[i].getName( ).equals("userinfo")){ userinfo= cookies[i].getValue(); break; } } if(userinfo!=null){ String[ ] information = userinfo. split("\\|" ); username=information[0]; password= information[1]; } } %> <form action = "LoginServlet" method="post"> 用户名:<input type = "text" name = "username" value = <%= username %>> <br> 密   码: <input type = "password" name = "password" value = <%= password %>><br> <input type = "submit" value = "登录"><input type = "reset" value = "重置"> </form> </body> </html>,又创建了一个LoginServlet,代码为:package com.test.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * Servlet implementation class LoginServlet */ @WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public LoginServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setHeader("Content-type","text/plain;charset = UTF -8" ); String username = request.getParameter("username"); String password= request.getParameter("password" ); if(username!=null&&password!= null) { if(username.equals(password)) { HttpSession session = request.getSession(); session.setAttribute("username", username); Cookie userinfocookie = new Cookie("userinfo" ,username + "|"+ password); userinfocookie.setMaxAge(60*5); response.addCookie(userinfocookie); response.sendRedirect("welcome. jsp" ); }else { //跳转到欢迎页面 response.getWriter().append("用户名密码错误,请重新登录5 秒后回到登录页面……"); response.setHeader("Refresh","5;URL= login.jsp"); } }else { response.getWriter().append("禁止直接访问,5秒后回到登录页面……"); response.setHeader("Refresh","5;URL = login.jsp"); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } } ,接着创建了一个welcome.jsp,代码为:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <% response.setHeader("Pragma" ,"No - Cache" ); response.setHeader( "Cache - Control" , "No - Cache" ); response.setDateHeader("Expires",0); if(session!= null){ String username =(String)session.getAttribute("username"); if(username!=null) {out.print("欢迎您,"+ username + "<a href ='LogoutServlet'>安全退出</a>"); } else { out.print("你还没有登录,5秒后跳转到登录页面……"); response.setHeader("Refresh","5;URL=login.jsp"); } }else{ out.print("禁止直接访问,5秒后跳转到登录页面……"); response.setHeader("Refresh","5;URL=login.jsp"); } %> </body> </html>,最后创建了一个LogoutServlet,代码为:package com.test.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * Servlet implementation class LogoutServlet */ @WebServlet("/LogoutServlet") public class LogoutServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public LogoutServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setCharacterEncoding("UTF-8"); response.setHeader("Content- type" ,"text/plain;charset = UTF - 8" );//判断当前请求是否存在对象 HttpSession session =request.getSession(false); if(session!= null) { session.invalidate(); Cookie usernameinfo = new Cookie("userinfo" , "" ); usernameinfo.setMaxAge(0); response.addCookie(usernameinfo); response.getWriter().append("注销成功,5秒后跳转到登录页面……"); response. setHeader("Refresh", "5;URL, = login. jsp" ); }else{ response.getWriter().append("你还未登录,无须注销5秒后跳转到登录页面……"); response. setHeader(" Refresh", "5 ;URL = login. jsp" ); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } } ,请问能完成这个实验的要求吗,如果不能请在我的代码上改动
最新发布
11-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值