request封装了所有的请求信息
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("请求方法:"+request.getMethod());
System.out.println("URI:"+request.getRequestURI());
System.out.println("URL:"+request.getRequestURL());
//获取所有请求头信息
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String key = (String) headerNames.nextElement();
String value = request.getHeader(key);
System.out.println(key+" "+value);
}
}
request小demo
<html>
<head>
<title>登录</title>
</head>
<body>
<h1>登录</h1>
<h2>Hello World!</h2>
<div style="text-align: center">
<%--这里表示:以post方式提交表单提交到我们的login请求--%>
<form action="${pageContext.request.contextPath}/login" method="post">
用户名:<input type="text" name="username"> <br>
密码:<input type="password" name="password"> <br>
爱好:
<input type="checkbox" name="hobbys" value="女孩">女孩
<input type="checkbox" name="hobbys" value="代码">代码
<input type="checkbox" name="hobbys" value="唱歌">唱歌
<input type="checkbox" name="hobbys" value="电影">电影
<br>
<input type="submit">
</form>
</div>
</body>
</html>
public class request extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbies = req.getParameterValues("hobby");
System.out.println("====================================");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.toString(hobbies));
System.out.println("====================================");
System.out.println(req.getContextPath());
req.getRequestDispatcher("/success.jsp").forward(req, resp);
}
}
重定向与转发的区别
(70条消息) 重定向与转发的区别与应用_Zzzer!的博客-CSDN博客_重定向和转发的区别
转发过程: 客户端浏览器发送http请求 → web服务器接受此请求 → 调用内部的一个方法在容器内部完成请求处理和转发动作 → 将目标资源发送给客户
//java代码示例
request.getRequestDispatcher("xxx.jsp或者servlet").forward(request,response);
重定向过程: 客户端浏览器发送http请求 → web服务器接收后发送30X状态码响应及对应新的location给客户浏览器 → 客户浏览器发现是30X响应,则自动再发送一个新的http请求,请求url是新的location地址→ 服务器根据此请求寻找资源并发送给客户。
//java代码示例
response.sendRedirect("xxx.jsp或者servlet");
原则上:要保持request域的数据时使用转发,要访问外站资源的时候用重定向,其余随便;
特殊的应用: 对数据进行修改、删除、添加操作的时候,应该用response.sendRedirect()。如果是采用了request.getRequestDispatcher().forward(request,response),那么操作前后的地址栏都不会发生改变,仍然是修改的控制器,如果此时再对当前页面刷新的话,就会重新发送一次请求对数据进行修改,这也就是有的人在刷新一次页面就增加一条数据的原因
GET方式:安全性差。因为是直接将数据显示在地址栏中,浏览器有缓冲,可记录用户信息。所以安全性低。
POST方式:安全性高。因为post方式提交数据时是采用的HTTP post机制,是将表单中的字段与值放置在HTTP HEADER内一起传送到ACTION所指的URL中,用户是看不见的
Cookie的处理分为:
服务器像客户端发送cookie
浏览器将cookie保存
之后每次http请求浏览器都会将cookie发送给服务器端。
Cookie就是我们所理解的缓存,本地缓存;比如客户端访问服务端,第一次访问结束后,我就会产生一个Cookie,把这个Cookie保留到客户端,打个比方:我第一次打开一个网页去看一个视频,它就需要网络或上网流量请求服务器获取资源,看完后服务端就会将你看的这个视频放到一个Cookie里面,然后发送给客户端,我下次再去看这个视频的时候,我就无需连接网络直接在本地即可观看,所以这就叫服务端产生(请求资源需要请求对应视频的服务器),发送给客户端(请求完毕后【就是看完后】,将资源保存到本地);有点儿像一边看一边下载。但是它有缺点,它除了能放视频它还能放电影、音乐、文章甚至我们的密码也能放,用户名信息也能放,所以放一些用户信息就比较危险了,比方说我第一次访问网站,我登录了,我的名字叫张三,密码abc,服务端将我的信息放到Cookie里面再发送给客户端,那我以后确实不需要登录了,我就可以直接在本地读取账号密码登录,这样就不安全了,万一别人用你电脑解析破解了。所以Cookie能提高访问服务端的效率,但是安全性较差!
public class mycookies extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// doGet(req, resp);
//解决中文乱码的问题
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
//从服务端来获取cookies
Cookie[] cookies = req.getCookies();
//判断cookies是否存在
if(cookies != null){
out.write("您的上一次访问时间是");
for (Cookie cookie : cookies) {
if (cookie.getName().equals("lastlogintime")) {
long l = Long.parseLong(cookie.getValue());
Date date = new Date(l);
out.write(date.toLocaleString());
}
}
}else {
out.println("这是您第一次访问本站");
}
Cookie lastlogintime = new Cookie("lastlogintime", System.currentTimeMillis() + "");
resp.addCookie(lastlogintime);
}
cookies设置时间
resp.addCookie(lastlogintime);
cookies一般会保存到用户目录下的Appdata里面
一个cookies只能保存一个信息
一个web站点可以给浏览器发送多个cookie,最高上限为20
300个cookie是浏览器上限
删除cookie:
Session
public class sessiondemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
//得到session
HttpSession session = req.getSession();
//session中存东西
session.setAttribute("name", "秦奥");
//获取session的Id
String id = session.getId();
//判断session是不是新创建的
if(session.isNew()){
resp.getWriter().write("session创建成功,ID"+id);
}else{
resp.getWriter().write("session已经在服务器当中工作了 ID"+id);
}
}
}
public class sessioneomo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("UTF-8");
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
HttpSession session = req.getSession();
session.getAttribute("name");
}
}
seesion可以储存一些用户信息
//得到session
HttpSession session = req.getSession();
//session中存东西
//session里面可以存一些用户信息然后实现共享
session.setAttribute("name", new person("wangshuaiyu", 11));
session的注销和删除(手动方式)
public class sessiondemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("name");
//注销session
session.invalidate();
}
}
session在web.xml中来进行自动注销
<!-- 可以配置session的配置-->
<session-config>
<!-- session的失效时间默认指的是分钟-->
<session-timeout>1</session-timeout>
</session-config>
Session中的一些常用方法说明
isNew():是否是新的Session,一般在第一次访问的时候出现
getid():拿到session,获取ID
getCreationTime():当前session创建的时间
getLastAccessedTime():最近的一次访问这个session的时间。
getRrquestedSessionid: 跟随上个网页cookies或者URL传过来的session
isRequestedSessionIdFromCookie():是否通过Cookies传过来的
isRequestedSessionIdFromURL():是否通过重写URL传过来的
isRequestedSessionIdValid():是不是有效的sessionID
Session与cookie功能效果相同。Session与Cookie的区别在于Session是记录在服务端的,而Cookie是记录在客户端的。
解释session:当访问服务器否个网页的时候,会在服务器端的内存里开辟一块内存,这块内存就叫做session,而这个内存是跟浏览器关联在一起的。这个浏览器指的是浏览器窗口,或者是浏览器的子窗口,意思就是,只允许当前这个session对应的浏览器访问,就算是在同一个机器上新启的浏览器也是无法访问的。而另外一个浏览器也需要记录session的话,就会再启一个属于自己的session
原理:HTTP协议是非连接性的,取完当前浏览器的内容,然后关闭浏览器后,链接就断开了,而没有任何机制去记录取出后的信息。而当需要访问同一个网站的另外一个页面时(就好比如在第一个页面选择购买的商品后,跳转到第二个页面去进行付款)这个时候取出来的信息,就读不出来了。所以必须要有一种机制让页面知道原理页面的session内容。