我们在浏览网页的时候,经常需要向服务器提交信息,并让后台程序处理。浏览器中使用 GET 和 POST 方法向服务器提交数据。
GET方法将请求的编码信息添加在网址后面,网址与编码信息通过"?"号分隔。如下所示:
http://www.runoob.com/hello?key1=value1&key2=value2
GET方法是浏览器默认传递参数的方法,一些敏感信息,如密码等建议不使用GET方法。
用get时,传输数据的大小有限制 (注意不是参数的个数有限制),最大为1024字节。
一些敏感信息,如密码等我们可以通过POST方法传递,POST提交数据是隐式的。
POST提交数据是不可见的,GET是通过在url里面传递的(可以看一下你浏览器的地址栏)。
JSP使用getParameter()来获得传递的参数,getInputStream()方法用来处理客户端的二进制数据流的请求。
<%@ page cOntentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
猫
狗
鸡
鸭
<%@ page import="java.util.Enumeration" %> <%@ page cOntentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>读取参数信息
参数名 | 对应值 |
---|---|
"+name+" | \n"); String url = request.getParameter(name); out.println(""+url+" |
PageContext:pageConext 存放的数据仅在当前页面有效。开发时使用较少。当前页面存放数据用表单标签中的 ,且该存值方式用户看不到。
ServletRequest: request 存放的数据在一次请求(转发:可以传数据)内有效。使用非常多。
HttpSession: session 存放的数据在一次会话(多次请求)中有效。使用的比较多。例如:存放用户的登录信息、购物车功能。
ServletContext: application 存放的数据在整个应用范围内都有效。因为范围太大,应尽量少用。用于统计在线人数。
1、什么是会话?如同打电话。
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
2、会话过程要解决的问题是什么?保持各个客户端自己的数据。
每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。
例如:用户点击超链接通过一个servlet购买了一个商品,程序应该想办法保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户购买的商品为用户结帐。
思考:用户购买的商品保存在request或servletContext中行不行?答:不行。
保存会话数据的两种技术:
COOKIE:是客户端技术,程序把每个用户的数据以COOKIE的形式写给用户各自的浏览器。
当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。
这样,web资源处理的就是用户各自的数据了。
HttpSession:Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象,
由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,
当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
无状态是指,当浏览器发送请求给服务器时,服务器响应客户端请求。但是当同一个浏览器再次发送请求给服务器时,服务器并不知道它就是刚才那个浏览器。简单来说,就是服务器不会去记得你,所以就是无状态协议。
COOKIE是存储在客户机的文本文件,它们保存了大量轨迹信息。在servlet技术基础上,JSP显然能够提供对HTTP COOKIE的支持。
通常有三个步骤来识别回头客:
JSP COOKIE 处理需要对中文进行编码与解码,方法如下:
String str = java.net.URLEncoder.encode("中文","UTF-8"); //编码 String str = java.net.URLDecoder.decode("编码后的字符串","UTF-8"); // 解码
使用JSP设置COOKIE包含三个步骤:
(1)创建一个COOKIE对象: 调用COOKIE的构造函数,使用一个COOKIE名称和值做参数,它们都是字符串。
COOKIE COOKIE = new COOKIE("key","value");
请务必牢记,名称和值中都不能包含空格或者如下的字符:
[ ] ( ) = , " / ? @ : ;
(2) 设置有效期:调用setMaxAge()函数表明COOKIE在多长时间(以秒为单位)内有效。下面的操作将有效期设为了24小时。
COOKIE.setMaxAge(60*60*24);
(3) 将COOKIE发送至HTTP响应头中:调用response.addCOOKIE()函数来向HTTP响应头中添加COOKIE。
response.addCOOKIE(COOKIE);
<%@ page cOntentType="text/html;charset=UTF-8" language="java" %> 站点名:
网址:
<%@ page import="java.net.URLEncoder" %> <%@ page cOntentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> <% // 编码,解决中文乱码 String str = URLEncoder.encode(request.getParameter("name"),"utf-8"); // 设置 name 和 url COOKIE COOKIE name = new COOKIE("name", str); COOKIE url = new COOKIE("url", request.getParameter("url")); // 设置COOKIE过期时间为24小时。 name.setMaxAge(60*60*24); url.setMaxAge(60*60*24); // 在响应头部添加COOKIE response.addCOOKIE( name ); response.addCOOKIE( url ); %>设置 COOKIE
网站名: <%= request.getParameter("name")%>
网址: <%= request.getParameter("url")%>
想要读取COOKIE,您就需要调用request.getCOOKIEs()方法来获得一个javax.servlet.http.COOKIE对象的数组,然后遍历这个数组,使用getName()方法和getValue()方法来获取每一个COOKIE的名称和值。
<%@ page cOntentType="text/html;charset=UTF-8" language="java" %> <%@ page import="java.net.*" %> <% COOKIE COOKIE = null; COOKIE[] COOKIEs = null; // 获取COOKIEs的数据,是一个数组 COOKIEs = request.getCOOKIEs(); if( COOKIEs != null ){ out.println("查找 COOKIE 名与值
"); for (int i = 0; i"); out.print("参数值: " + URLDecoder.decode(COOKIE.getValue(), "utf-8") +"
"); out.print("------------------------------------
"); } }else{ out.println("没有发现 COOKIE
"); } %>
删除COOKIE非常简单。如果您想要删除一个COOKIE,按照下面给的步骤来做就行了:
下面的程序删除一个名为"name"的COOKIE,当您第二次运行COOKIEDemo2.jsp时,name 将会为 null。
<%@ page cOntentType="text/html;charset=UTF-8" language="java" %> <%@ page import="java.net.*" %> <% COOKIE COOKIE = null; COOKIE[] COOKIEs = null; // 获取当前域名下的COOKIEs,是一个数组 COOKIEs = request.getCOOKIEs(); if( COOKIEs != null ){ out.println("查找 COOKIE 名与值
"); for (int i = 0; i"); } out.print("参数名 : " + COOKIE.getName()); out.print("
"); out.print("参数值: " + URLDecoder.decode(COOKIE.getValue(), "utf-8") +"
"); out.print("------------------------------------
"); } }else{ out.println("没有发现 COOKIE
"); } %>
HttpSession是有JavaWeb提供的,用来会话跟踪的类,session是服务器对象,保存在服务器端;
HttpSession是Servlet三大域对象之一(request、session、application),所以它也有setAttribute()、getAttribute()、removeAttribute()方法;
HttpSession底层依赖COOKIE,或是URL重写。
会话:一个用户对服务器的多次连贯性请求,所谓连贯性请求,就是该用户多次请求中间没有关闭浏览器。
Servlet中得到session对象:HttpSession session = request.getSession();
JSP中得到session对象:session是jsp内置对象之下,不用创建就可以直接使用。
void setAttribute(String name,Object val); Object getAttribute(String name); void removeAttribute(String name);
login.jsp 登录页面
LoginSuccess.jsp 只有登录成功才能访问的页面
LoginServlet:校验用户是否登录成功
login.jsp 提供登录表单,提交表单请求LoginServlet
LoginServlet 获取请求参数,校验用户是否登录成功
失败:保存错误信息到request域,转发到login.jsp,在login.jsp中显示request域中的错误信息;
成功:保存用户信息到session域中,重定向到LoginSuccess.jsp页面,显示session域中的用户信息。
LoginSuccess.jsp 从session域获取用户信息,如果不存在,显示“您还没有登录”,存在则显示用户信息;
只要用户没有关闭浏览器,session就一直存在,那么保存在session中的用户信息也就一起存在,那么用户访问LoginSuccess.jsp就会通过
login.jsp
<%@ page cOntentType="text/html;charset=UTF-8" language="java" %> <% //获取COOKIE的值 String name = ""; String pwd = ""; COOKIE[] cs = request.getCOOKIEs(); if(cs!=null){ for(COOKIE c : cs){ if("username".equals(c.getName())){ name = c.getValue(); } if("pwd".equals(c.getName())){ pwd = c.getValue(); } } } %> <% //获取request信息 String message=""; String mess = (String)request.getAttribute("message"); if(mess!=null){ message = mess; } %>用户登录
<%=message %>账号:
密码:
LoginServlet.java
package com.demo.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; import java.io.IOException; @WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置请求的字符编码 request.setCharacterEncoding("utf-8"); //接收客户端请求 String username = request.getParameter("username"); String pwd = request.getParameter("pwd"); //判断是否登录成功 if("admin".equals(username) && "1234".equals(pwd)){ //登录成功,把信息保存到COOKIE中 COOKIE c1 = new COOKIE("username",username); COOKIE c2 = new COOKIE("pwd",pwd); c1.setMaxAge(60*60*24); c2.setMaxAge(60*60*24); response.addCOOKIE(c1); response.addCOOKIE(c2); //登录成功,保存用户名到session中,并重定向到LoginSuccess.jsp HttpSession session = request.getSession(); session.setAttribute("username", username); response.sendRedirect("/LoginSuccess.jsp"); }else{ //转发给客户端“登录失败” request.setAttribute("message", "用户信息错误,请重新登录"); request.getRequestDispatcher("/login.jsp").forward(request, response); } } }
LoginSuccess.jsp
<%@ page cOntentType="text/html;charset=UTF-8" language="java" %> <% //获取session信息 String name = (String)session.getAttribute("username"); if(name==null){ //session不存在,转发到登录页面,并提示信息 request.setAttribute("message", "您还没有登录,不能访问页面"); request.getRequestDispatcher("/login.jsp").forward(request, response); //重定向到login.jsp,不会显示request提示的信息 //response.sendRedirect("/login/login.jsp"); return; } %>登录成功
你好<%=name %>,欢迎登录!
一个网络服务器可以发送一个隐藏的HTML表单域和一个唯一的session ID,就像下面这样:
这个条目意味着,当表单被提交时,指定的名称和值将会自动包含在GET或POST数据中。每当浏览器发送一个请求,session_id的值就可以用来保存不同浏览器的轨迹。
这种方式可能是一种有效的方式,但点击标签中的超链接时不会产生表单提交事件,因此隐藏表单域也不支持通用会话跟踪。
您可以在每个URL后面添加一些额外的数据来区分会话,服务器能够根据这些数据来关联session标识符。
举例来说,http://w3cschool.cc/file.htm;sessiOnid=12345, session标识符为sessiOnid=12345,服务器可以用这个数据来识别客户端。
相比而言,重写URL是更好的方式来,就算浏览器不支持COOKIEs也能工作,但缺点是您必须为每个URL动态指定session ID,就算这是个简单的HTML页面。
除了以上几种方法外,JSP利用servlet提供的HttpSession接口来识别一个用户,存储这个用户的所有访问信息。
默认情况下,JSP允许会话跟踪,一个新的HttpSession对象将会自动地为新的客户端实例化。禁止会话跟踪需要显式地关掉它,通过将page指令中session属性值设为false来实现,就像下面这样:
<%@ page session="false" %>
JSP引擎将隐含的session对象暴露给开发者。由于提供了session对象,开发者就可以方便地存储或检索数据。
下表列出了session对象的一些重要方法:
服务器不会马上给你创建session,在第一次获取session时,即reques.getSession()方法执行时,才会创建session。
获取COOKIE中的JSESSIONID:
(未完待续)
此篇是我在学习过程中参考菜鸟教程以及笔记和别人博客(黑泽君)完成
Java匹马行天下依旧在更新中,欢迎大家关注,感觉可以的可以点击一下推荐,若如有误,感谢指正,谢谢!