利用JSP session对象保持住登录状态

http协议本身是一种无状态的协议,也就是客户端连续发送的多个请求之间没有联系,下一次请求不关心上一次请求的状态。

而实际运用中却希望服务器能记住客户端请求的状态,比如在网上购物系统中,服务器端应该能够识别并跟踪每个登录到系统中的用户挑选并购买商品的整个流程 。为此,web服务器必须采用一种机制来唯一地标识一个用户,同时记录该用户的状态,这就要用到会话跟踪技术。

Java Web使用Session来跟踪会话和管理会话内的状态。

Session对象是一个jsp内置对象,它在第一个jsp页面被装载时自动创建,完成会话期管理。

从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间反复连接,反复刷新一个页面,服务器应当通过某种办法知道这是同一个客户,这就需要session对象。

当发生以下四种情形其中之一时,session对象中的数据便会清空 :
用户关闭目前正在使用的浏览器程序。
关闭网页服务器。
用户未向服务器提出请求超过预设的时间,Tomcat服务器预设为30分钟。
运行程序结束session。

1.建立session变量

在JSP中不需要特别设置程序代码来建立用户session,当程序使用了session对象时,便会自动建立session,而下面这行语句便是在session中新增变量数据的方式:
session.setAttribute(“变量名称”,变量内容)
变量内容可为字符串或者其他对象类型,接着让我们来看看如何使用这个方法在session中设置变量数据:

<%
session.setAttribute(“id”,”编号”); //设置字符串
session.setAttribute(“expire”,new Date(86400*10)); //设置日期
session.setAttribute(“level”,new Integer(3)); //设置整数
%>

2.返回session中的变量

在session中设置了变量数据后,在其他的各个网页中便可使用getAttribute读取其中的内容,此方法所返回的数据类型为对象(Object)类型,语法如下:
session.getAttribute(“变量名称”)

3.返回所有session中的变量名称

getAttributeNames()方法可以取出session中所有变量的名称,其结果为一个枚举类的实例。语法为:
session.getAttributeNames()

4.清除session中的变量
removeAttribute()方法可以清除session中的变量数据,使用语法如下:
session.removeAttribute(“变量名称”)

5.结束session

对于已经建立的session,可使用invalidate()方法将其结束,使用语法为:
session.invalidate()

其他的一些可能会用到的方法:

现在写一个实例:通过session来记录客户的登录状态:
index.jsp登录界面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
 <head>
  <title>$Title$</title>
 </head>
 <body>
 <form action="process_login.jsp" method="post">
  用户名:<input type="text" name="username">
  密码:<input type="text" name="password">
  <input type="submit" value="submit">
  <input type="reset" value="reset">
 </form>
 <a href="page1.jsp" rel="external nofollow" rel="external nofollow" >1</a>
 <a href="page2.jsp" rel="external nofollow" rel="external nofollow" >2</a>
 <a href="page3.jsp" rel="external nofollow" rel="external nofollow" >3</a>
 </body>
</html>

process_login.jsp处理登录数据,这里知道输入密码是123都可以登录成功:

session.getAttribute()将会告诉page1.jsp文件这个用户是否登录成功了

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
  String username=request.getParameter("username");
  String password=request.getParameter("password");
  if (password.equals("123")){
    session.setAttribute("username",username);
  }
  response.sendRedirect("page1.jsp");
%>

logout.jsp登出

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
  session.invalidate();
  response.sendRedirect("index.jsp");
%>

page1.jsp, page2.jsp, page3.jsp大同小异显示不同的页面,用于验证登录状态的记录(这里仅以page1.jsp为例):

注意这里的判断逻辑是一种很有趣的写法,把jsp代码和html代码完全融合起来了,不过我觉得这样写还是比较乱,宁愿只用一个jsp代码段,里面用out.println()在html中来实现显示不同的内容

这里主要是靠判断session.username是否为空来判断是否登录过了,并且传递相关的参数信息

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>Title</title>
</head>
<body>
  这里是Page1<br>
  <%if (session.getAttribute("username")==null){%>
  用户还没有登录
  <%}else {%>
  已登录,用户名:<%= session.getAttribute("username")%>
  <%}%>
  <br>
  <a href="page1.jsp" rel="external nofollow" rel="external nofollow" >page1</a>
  <a href="page2.jsp" rel="external nofollow" rel="external nofollow" >page2</a>
  <a href="page3.jsp" rel="external nofollow" rel="external nofollow" >page3</a>
  <a href="index.jsp" rel="external nofollow" >login</a>
  <a href="logout.jsp" rel="external nofollow" >logout </a>
</body>
</html>

可以看到,登录以后,不管跳转到哪个页面,用户的登录状态都没有丢失

一旦logout登出以后,session.invalidate()方法被调用,session被销毁,就跟踪不到用户的登录信息了

同时,如果我采用另一个浏览器访问同样的页面,以“2号用户”为username登录,也会一直记录到这个用户的登录信息(不过如果是同一种浏览器的话就不行了)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2017-05-18

JSP 开发之 releaseSession的实例详解

JSP 开发之 releaseSession的实例详解 Hibernate可以实现分页查询,昨天试了一下,分页效果不错.但是发现了一个问题,就是当请求超过20次的时候页面就会卡死.经检查,是卡在分页查询这一块. 应用程序采用struts2 + spring2 + hibernate3架构 连接池配置使用的是c3p0, 最大池大小为20, 很显然是连接池耗尽导致的. 增加连接池大小只是饮鸩止渴,总还有耗尽的时候,必须找到根本原因. Dao类的分页查询方法如下: java 代码  public Li

JSP spring boot / cloud 使用filter防止XSS

JSP spring boot / cloud 使用filter防止XSS 一.前言 XSS(跨站脚本攻击) 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的. 二.思路 基于filter拦截,将特殊字符替换为html转意字符 (如

JSP 获取spring容器中bean的两种方法总结

JSP 获取spring容器中bean的方法总结 方案1(Web中使用): ApplicationContext ct = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletActionContext.getServletContext()); logService = (ISysLogService) ct.getBean("sysLogServiceImpl"); 说明:getRequiredWeb

springMVC如何将controller中数据传递到jsp页面

1> 将方法的返回值该为ModelAndView在返回时,将数据存储在ModelAndView对象中如: newModelAndView("/WEBINF/jsp/showData.jsp","message",message) 其中第一个参数为url,第二个参数为要传递的数据的key,第三个参数为数据对象. 在这里要注意的是 数据是默认被存放在request中的. 示例: @RequestMapping(value="/mad/showData_1

JSP 自定义注解及记录操作日志

JSP 自定义注解及记录操作日志 Spring的配置文件 <aop:aspectj-autoproxy /> 日志拦截器 package com.vem.interceptor; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.anno

详解springmvc 中controller与jsp传值

在springmvc中的controller所对应的函数中,如果需要从*.jsp页面中获取数据,可以自行在函数括号中写,springmvc会自动封装传过来的值. spring-mvc.xml 中加入如下语句: <!-- 自动扫描 --> <context:component-scan base-package="cn.itcast.springmvc.service,cn.itcast.springmvc.web.controller"/> <!-- 注解

详解SpringBoot中Controller接收对象列表实现

如果Spring Boot中对应的Controller要接收一个对象,该对象中又存放了一个List列表,那么页面该如何传递相关应的参数信息呢. 本篇文章给大家一个简单的示例,提供一种实现方式. 实体类 首先看实体类的结构(注意使用了Lombok): @Data public class Rules { private List<Rule> rules; } 对应Rule实体类代码如下: @Data public class Rule { /** * 类名 */ private String c

详解SpringMVC中设置静态资源不被拦截的问题

这两天使用SpringMVC来做登录,注册的小demo,其中用到了springmvc拦截器对登录操作进行拦截处理,并对url进行验证.验证通过则可以进行handler的处理,如果验证不通过直接跳回或者重定向到指定的页面. 但是在做这个操作的时候,遇到很大的一个问题就是项目demo中的静态资源都会在每次请求中被拦截处理了!跳回页面的时候,页面就不再是想想中的呈现的样子了. 以为我在springmvc.xml中已经配置了拦截器和静态资源的配置却还是出现这样的结果,所以就又是看前段浏览器的设置,又是看

详解SpringMVC中使用Interceptor拦截器

SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那样子判断当前时间是否是购票时间.  一.定义Interceptor实现类 SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的.在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,第一种方式是要定义的Interce

详解Struts2中对未登录jsp页面实现拦截功能

Struts2中拦截器大家都很经常使用,但是拦截器只能拦截action不能拦截jsp页面.这个时候就有点尴尬了,按道理来说没登录的用户只能看login界面不能够通过输入URL进行界面跳转,这显然是不合理的.这里介绍Struts2中Filter实现jsp页面拦截的功能.(有兴趣的人可以去研究Filter过滤器的其它用法,因为利用过滤器也可以实现action拦截的功能) 下面直接上代码,边看边分析实现步骤和原理. 1.web.xml中的配置信息: <filter> <filter-name&

详解SpringMVC的url-pattern配置及原理剖析

xml里面配置标签: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> &

详解SpringMVC从基础到源码

认识SpringMVC SpringMVC 框架是以请求为驱动,围绕 Servlet 设计,将请求发给控制器,然后通过模型对象,分派器来展示请求结果视图.其中核心类是 DispatcherServlet,它是一个 Servlet,顶层是实现的Servlet接口. SpringMVC 处理请求过程 客户端发起请求,会首先经过前端控制器 DispatcherServlet 进行转发,转发到 Handler Mapping DispatcherServlet 从 Handler Mapping 查找处

详解Angular中$cacheFactory缓存的使用

最近在学习使用angular,慢慢从jquery ui转型到用ng开发,发现了很多不同点,继续学习吧: 首先创建一个服务,以便在项目中的controller中引用,服务有几种存在形式,factory();service();constant();value();provider();其中provider是最基础的,其他服务都是基于这个写的,具体区别这里就不展开了,大家可以看看源码:服务是各个controller之间通话的重要形式,在实际项目中会用的很多,下面是代码: angular.module

SpringMVC中controller接收json数据的方法

本文实例为大家分享了SpringMVC中controller接收json数据的方法,供大家参考,具体内容如下 1.jsp页面发送ajax的post请求: function postJson(){ var json = {"username" : "imp", "password" : "123456"}; $.ajax({ type : "post", url : "<%=basePath

SpringMVC中controller返回json数据的方法

本文实例为大家分享了SpringMVC中controller返回json数据的2种方法,供大家参考,具体内容如下 1.jsp的ajax请求: function getJson(){ $.ajax({ type:"get", dataType:"json", url:"<%=basePath %>getJson", success:function(data){ for(var i=0;i<jsonData.length;i++)