javaWeb之session简单小结

跟踪用户的状态信息由2种方案

一:Cookie是在客户端保存信息。在发请求时将Cookie传到request头部。用于区分是否为同一个浏览器

二:session:用来在客户端与服务器之间保持状态的解决方案(就是能使用同一个session)。有时候Session也用来指解决方案的存储结构。
 

HttpSession的生命周期

啥时创建session对象,啥时销毁session对象
啥时创建HttpSession对象?
    Jsp:
    是否浏览器访问服务端的任何一个jsp或者Servlet,服务器都会创建一个HttpSession对象呢?
    不一定,若当前的jsp是客户端访问的当前WEB应用的第一个资源且jsp的page指定的session属性值为false
则服务器不会为当前jsp创建一个HttpSession对象。
     

   <%@ page language="java" contentType="text/html; charset=UTF-8"
            pageEncoding="UTF-8"; session=""false"%>
        
        
        
        
        Insert title here
        
        
            <%=session.getId() %>  //会报错
        
        

若当前的jsp不是客户端访问的当前WEB应用的第一个资源,且其他页面已经创建一个HttpSession对象
则服务器不会为当前jsp创建一个HttpSession对象,而会把和当前会话关联的那个HttpSession对象返回给当前的jsp页面

    Servlet:
    若Servlet是客户端访问的第一个WEB应用的资源,则只有调用request.getSession()或者request.getSsssion(true)
才会创建HttpSession对象,若为request.getSession(false)则无法创建HttpSession对象。
      

 String arr2 = (String) req.getSession().getAttribute("arr");
        System.out.println("aqswd"+ arr2);


    第二种情况与jsp的第二种情况一致

    session="false"到底是啥意思?
    表示当前jsp页面禁用session隐含对象,但可以用其他的显示的HttpSession对象.
    

    request.getSession(false)是指如果存在session就返回session,如果不存在就返回一个null值,
    getSession(true)的话就是不存在就创建一个新的session.

在Servlet中如何获取HttpSession对象

request.getSession(boolean create);
    create为false,则若没有和当前jsp页面相关联的HttpSession对象,则返回null;若有,则返回true
    create为true,一定返回一个HttpSession对象,若没有和当前jsp页面相关联的HttpSession对象,则服务器创建一个新的
HttpSession对象返回,若有则直接返回关联。

 request.getSession()等同于request.getSession(true);

啥时销毁session对象

    ①直接调用HttpSession对象.invalidate();//使当前的session对象失效
	session.invalidate();
	
	②服务器卸载了当前WEB应用
	
	③.超过HttpSession的过期时间  -->  单位是秒
	out.println("
"+session.getMaxInactiveInterval()); 修改HttpSession的过期时间 单位是秒 session.setMaxInactiveInterval(5); 在tomcat的web.xml下修改 30 -->(30分钟) ④并不是关闭了浏览器就销毁了HttpSession 有两中方法 第一种:url重写 http://192.168.1.102:8080/sessionx/sessionx.jsp 第二种:持久化Cookie

HttpSession属性

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
	String x = (String)session.getAttribute("name");
	
%>




Insert title here



	SessionId : <%=session.getId() %>
	

<!-- 如果客户端请求消息中返回了一个与Servlet程序当前获得的HttpSession对象的会话标识号相同的会话 标识号,则认为这个HttpSession对象不是新建的。 --> isNew : <%=session.isNew() %>

MaxInactiveInterval : <%=session.getMaxInactiveInterval() %>

CreationTime : <%=session.getCreationTime() %>

getLastAccessedTime : <%=session.getLastAccessedTime() %>

>

绝对路径的问题

1)开发时建议编写"绝对路径":写绝对路径绝对不会有问题但写相对路径肯定有问题。
    在由Servlet转发到jsp页面,此时浏览器地址栏上显示的是Servlet的路径,而若jsp页面的超链接还是
    相对于该jsp页面的地址,则可能会出现路径混乱的问题。
    成功的案例 a.jsp和path下的b.jsp和c.jsp
    错误案例 a.jsp和path2下的b.jsp和c.jsp和PathServlet
    
                        a.jsp -->                        PathServlet --> b.jsp  (报错404)                              
                       |                                                               |                                            
    http://localhost:8080/sessionx/a.jsp     http://localhost:8080/path3/b.jsp   

成功的案例 a.jsp和path下的b.jsp和c.jsp

a.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here



	
AAA page
to BBB
to BBB to BBB

b.jsp 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


	
BBB page
to CCC

c.jsp  

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


	
CCC page
to AAA

错误案例 的PathServlet 

package cn.itcast.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/hello.s")
public class PathServlet extends BasicServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		System.out.println(req.getContextPath());
		String[] s = new String[]{"asd","sdf","dfg"};
		req.setAttribute("name", s);
        //先说明WEB应用的根目录为sessionx
        //则如下请求响应的url地址为 http://localhost:8080/path3/b.jsp
        //而不是http://localhost:8080/sessionx/path3/b.jsp
		resp.sendRedirect("/path3/b.jsp");
	}
	
	
}

 2)编写绝对路径可以避免一些问题
    ①在javaWEB中啥叫"绝对路径":相对于当前WEB应用的根路径的路径  
    当前WEB应用的根路径:http://localhost:8080/sessionx
    当前WEB应用的站点路径:http://localhost:8080

    http://localhost:8080/sessionx/a.jsp-->是绝对路径
    http://localhost:8080/a.jsp     -->不是绝对路径
    
    ②如何完成编写
        若/表示站点的根目录在其前面加上contextPath就可以了
        to BBB
        
        resp.sendRedirect(req.getContextPath()+"/path3/b.jsp");
        
    3)javaWEB开发中的/到底表示啥 req.getContextPath()-->/sessionx
        ①当前WEB应用的根路径-->http://localhost:8080/sessionx:若/需要交给Servlet容器来处理则表示当前WEB应用的根路径
            >请求转方法时
            req.getRequestDispatcher("/path3/b.jsp").forward(req, resp);  --> 不是url时要跳转到                        http://localhost:8080/sessionx/path3/b.jsp
            
            >web.xml中
            


    ff
    /hello.s  -->表示的是http://localhost:8080/sessionx/hello.s
 


          >各种定制标签的/  (例如jstl中的URL操作  https://blog.csdn.net/qq_35654259/article/details/86605271)
              
        ②WEB应用的根路径-->http://localhost:8080 :若/交给浏览器来处理
            >超链接
                

to CCC  -->表http://localhost:8080/sessionx/path3/c.jsp


            >表单中的action

           -->http://localhost:8080/log.jsp  


            >做请求重定向response.sendRedirect:
          

 response.sendRedirect("/a.jsp");  -->http://localhost:8080/a.jsp

 

你可能感兴趣的:(javaweb)