Java Web实战详细教程(二十一)Session鉴权实战

        上一篇文章,我们讲过了Cookie,知道Cookie是服务器响应到浏览器的一段字符串,并可以伴随后续的请求传递到浏览器。
        根据Cookie的以上特性,服务器可以生成一段不重复的字符串,从而记录请求时哪个浏览器发送来的。如下图所示:
在这里插入图片描述        由此可见,Session的原理是服务器会为一次不携带JSessionID的请求,生成一个键值为JSessionID的Cookie,将该Cookie的时效设为负数,即只保存在客户端内存中,以后每次请求都携带该cookie,从而记录会话。关闭浏览器则该cookie消失,即访问者与服务器的会话消失。
        服务器的Session机制是由Servlet容器所实现,即由Tomcat实现,它维护着一个容器,存放当前所有访问者与服务器的会话,我们只需要通过HttpSession对象就可以轻易的获得抽象的本次会话的Session对象。在Servlet中Session是可通过request.getSession()方法获得,在JSP中,session是一个内置对象。

        通过浏览器的调试工具,可以观察JSessionId。
        第一次访问网站,会响应回一个JSessionID:
在这里插入图片描述
        再次访问网站,会在请求中携带一个JSessionID,注意观察它们的值是一致的。
在这里插入图片描述
        而当关闭浏览器,再次打开,再访问网站,会发现不再携带JSessionID,而是响应回一个新的JSessionID,它的值与之前是不一样的:
在这里插入图片描述

        通过Session机制,可以方便的实现系统的鉴权,即权限处理。思路是当登陆成功后,将用户信息保存在Session对象中,Session因为也是作用域对象,所以和request一样有getAttribute(name)、setAttribute(name,value)方法。然后在需要权限验证的代码中,判断session中是否有该键值的对象,即可以实现鉴权的操作。
        下面,通过对教务管理系统添加鉴权操作的实战来更好的理解Session。

        UserController的doLogin方法在判断成功以后,添加以下代码:

//拿到session对象,session作为一个作用域,可以存放键值对属性
	HttpSession session = request.getSession();
	session.setAttribute("user", user);

        在系统需要权限控制的地方添加验证,判断session中是否有键值是user的值,如果不为null,说明成功登录过,可以访问资源,如果为null说明没有登录,没有权限访问。目前,系统中只有StudentController中需要添加鉴权操作:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    
    
	if (request.getSession().getAttribute("user") != null) {
    
    
		String type = request.getParameter("type");
		if (type == null) {
    
    
			search(request, response);
		} else if (type.equals("showAdd")) {
    
    
			showAdd(request, response);
		} else if (type.equals("add")) {
    
    
			add(request, response);
		} else if (type.equals("showUpdate")) {
    
    
			showUpdate(request, response);
		} else if (type.equals("update")) {
    
    
			update(request, response);
		} else if (type.equals("delete")) {
    
    
			delete(request, response);
		}
	} else {
    
    
		response.sendRedirect("user?type=showLogin");
	}
}

        完成以上代码后,网站实现只有当登录成功后才能访问学生资源,否则如果没有登录,通过url访问学生资源,会自动跳转到登录页面。

おすすめ

転載: blog.csdn.net/GodBlessYouAndMe/article/details/121901474