Request+Cookie+Session
HttpServletRequest
客户端发送过来的请求通过tomcat内核进行提取,然后将数据封装到httpservletrequest对象中,在调用servlet的service的方法的时候将此对象作为参数传递过来,HttpServlet在service内部调用doGet和doPost方法将此对象作为参数传递过来。
获取请求行内容
-
获取请求方式
-
//获取请求方式String method = request.getMethod();System.out.println(method); //GET
-
-
获取uri和url路径
-
uri:统一资源标识符,通过request获取uri获取的是请求路径中web应用后的字符串不包含QueryString
-
url:同一资源定位符,通过request获取的url是带有协议名称应用名称端口号的完全路径
-
//获取uri,就是请求行中的地址
String uri = request.getRequestURI();
//获取url,获取全路径
StringBuffer url = request.getRequestUR L();
System.out.println(uri); ///WebTest/tt
System.out.println(url); //http://192.16 8.6.154:8080/WebTest/tt
-
获取web应用的名称
//获取当前web应用名称
String webName = request.getContextPath();
System.out.println(webName); // /WebTest
-
获取请求的ip地址(了解)
//获取请求的客户端的ip地址
String ipAddress = request.getRemoteAddr();
System.out.println(ipAddress); //192.168.6.171
-
获取get请求表单数据(了解)
//获取get请求网址后的内容,如果是post获取内容 为null
String queryString = request.getQueryString();
System.out.println(queryString); //name=123
获取请求头的内容
-
获取指定头的数据
//获取指定header的内容 String header = request.getHeader("User-A gent"); System.out.println(header); //Mozilla/5.0 (Windows NT 10.0; WOW64) App leWebKit/537.36 (KHTML, like Gecko)
Chrome/58.0.3029.110 Safari/537.36
-
获取所有头信息(了解)
//获取所有header的名字
Enumeration<String> names = request.getHead erNames();
while(names.hasMoreElements()){
String str = names.nextElement();
String value = request.getHeader(str);
System.out.println(str+"="+value);
}
获取请求体的内容
获取请求体中的提交的表单数据,尽管get请求数据在url后,用此方法同样可以获取。
-
获取提交表单数据中某个具体的name的value
//对于get请求虽然表单数据在请求行中,也是通过此方法 获取提交数据的 String name = request.getParameter("username");
-
获取提交表单数据中一个name多个value数据
//对于表单中一个name有多个值的可以使用此方法,如che ckbox,返回值是数组 String [] hobbys = request.getParameterValu es("hobby");
-
获取提交表单所有数据
-
数据格式是map格式,key指的是表单中的name属性,value是字符串数组,数组中存放的是对应的value属性
-
1 //获取所有的表单数据返回值是map形式,key是字符串表 单的name属性,值是String数组,存放的是 2 Map<String, String[]> map = request.getPara meterMap(); 3 for(String key : map.keySet()){ 4 String[] values = map.get(key); 5 System.out.println(key+"="+Arrays.toStr ing(values)); 6 }
-
请求乱码问题
-
对于表单提交,由于页面的编码格式utf8,但在服务器端,将数据提取封装到request对象的时候采用的是iso88591,所以出现乱码。
-
对于post提交
request.setCharacterEncoding("UTF-8");
对于get提交,如果出现乱码
String parameter = request.getParameter("us ername");
parameter = new String(parameter.getbyte s("iso8859-1"),"utf-8");
内部转发
客户端向服务器发送请求,服务器收到这个请求以后,可以在内部进行一个转发功能,也就是在不告知客户端的情况
下进行请求的转发
//获取内部转发器 RequestDispatcher dispatcher = request.getR equestDispatcher("/index.jsp"); //进行转发 dispatcher.forward(request, response); //通常是连写 request.getRequestDispatcher("/index.js p").forward(request, response);
- 内部转发客户端浏览器的地址不会发生改变,因为自始至终客户端只发送一个请求
- 通过内部转发路径一定要注意,因为操作过程是在服务器内部进行操作的,所以地址就不能够是客户端地址,而应是服务器端地址,路径不能再写web应用的名称,/就web应用的根目录
- 通过内部转发,两个servlet或者两个界面的接收到的request内的内容是相同的
- 因为内部转发是在服务器内部做的处理,所以内部转发是可以直接访问到WEBINF下的内容的
内部转发和重定向的区别
域对象
request对象也是一个域对象,所以也是可以存放数据的
数据的写入,读取,删除
- 向request域中放入数据 setAtrribute(Stringname,Object obj);
- 从request域中获取数据 getAttribute(String name);
- 从request域中删除数据 removeAttribute(String name);
-
request域生命周期
-
创建:一次请求访问的时候创建request
-
销毁:一次请求结束后
-
作用范围:只在一次请求中
-
-
request和servletContext区别
-
相同点
-
都是域对象,都能存放,读取,删除数据
-
-
不同点
-
servletContext随着服务器的开启而开启,服务器的关闭而关闭,作用范围在整个服务器服务期间
-
request每一次请求tomcat都会重新创建一个新的request,所以request的作用范围只在一个请求中,如果使用内部转发机制建议使用request做为存储
-
-
Cookie&Session
HTTP协议是无状态的协议,也就是说每次客户端访问服务器,对于服务器而言,其实并不知道是谁在访问,如果要保证每次客户端访问时候,让我们的服务器能够区分出来是谁在访问,就需要运用会话技术。
什么是会话?
从用户打开客户端访问我们的web应用,到用户关闭客户端这个过程称作为一次会话。
会话技术的分类
Cookie:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端 可以清除cookie
Session:将数据存储到服务器端,安全性相对好,增加服务器的压力。
Cookie
-
cookie存储过程
- 服务器端将需要存储的数据放在cookie中,通过响应头的形式发送给客户端,客户端收到了这个头信息,就会将数据进行保存,客户端再次请求服务的时候就会将此信息放在请求头中,那么服务器端通过获取请求头就能得到不同用户的cookie,从而区分出了不同的用户,做出不同的处理
Session
-
获得Session对象
-
域对象
-
写入,读取,删除数据
-
Session的生命周期