记一次session过期问题

问题报错:
验证码是存在session中,但是一登录就报验证码失效。
排查步骤:发现是session存的域名不对
1、项目设置的session位置:在拦截器中把验证码存入session

验证码存入session中

@WebServlet("/image/identifyingCode.img")
public class IdentifyingCodeServlet extends HttpServlet {
		// 将认证码存入SESSION
		session.setAttribute("rand", sRand);
		// 图象生效
		g.dispose();
		ServletOutputStream responseOutputStream = response.getOutputStream();
		// 输出图象到页面
		ImageIO.write(image, "JPEG", responseOutputStream);

		// 以下关闭输入流!
		responseOutputStream.flush();
		responseOutputStream.close();
}

登录验证验证码

	HttpServletRequest request = ContextFilter.context.get();
	if (loginType == null || !loginType.equals("auto")) {// 自动登录时不验证验证码
		if (request.getSession().getAttribute("rand") == null) {
			return getErrorResponse(ResponseCodeEnum.FAIL.getValue(),
					getI18n("i18n_account_error_VerificationCodeOverTime", "验证码已过期."));
		}
		String identifyCode = (String) request.getSession().getAttribute("rand");
		if (!identifyCode.equalsIgnoreCase(subAccountVO.getIdentifyCode())) {
			return getErrorResponse(ResponseCodeEnum.FAIL.getValue(),
					getI18n("i18n_account_error_VerificationCodeError", "验证码错误."));
		}
	}

域名中配置session的有效位置
Session 默认是不共享的,因为 Cookie 名称为 JSESSIONID 的 Cookie 根域是默认是没设置的,访问不同的二级域名,其 Cookie 就重新生成,而 session 就是根据这个 Cookie 来生成的,所以在不同的二级域名下生成的 Session 也不一样。

解决办法:
在项目的/MET-INF/ 目录下创建一个 context.xml 文件,内容为:
1 2 <?xml version='1.0' encoding='UTF-8'?>
项目中在打包的位置加上content.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context useHttpOnly="true" sessionCookiePath="/"
         sessionCookieDomain=".wingtech.com" />

拓展1:

cookie 常见属性
(1)name=value

键值对,设置 Cookie 的名称及相对应的值。

(2)domain

指定 cookie 所属域名,默认是当前域名。如果 cookie 的 domain 设置为 taobao.com,那么 item.taobao.com, order.taobao.com 都是可以共享 cookie 的, 但是访问 tmall.com 就不能共享 cookie 了,这就涉及跨域访问的问题,跨域问题如何解决,这里不展开,有兴趣可以自行搜索。

(3)path

指定 cookie 在哪个路径(路由)下生效,默认是 '/'。如果设置为 /abc,则只有 /abc 下的路由可以访问到该 cookie,如:/abc/read。

(4)expires

指定 cookie 的过期时间(GMT时间格式),到达该时间点后该 cookie 就会自动失效。

(5)max-age

HTTP 1.1中定义的,优先级高于 expires 字段。

max-age 表示 cookie 有效期,单位秒。如果为正数,则该 cookie 在 max-age 秒后失效;如果为负数,该 cookie 为临时 cookie ,关闭浏览器即失效,浏览器也不会以任何形式保存该 cookie ;如果为 0,表示删除该 cookie 。默认为 -1。

(6)HttpOnly

如果给某个 cookie 设置了 httpOnly 属性,则无法通过 JS 脚本读写该 cookie 的信息。

(7)secure

该 cookie 是否仅被使用安全协议传输,默认为false。当 secure 值为 true 时,cookie 在 HTTP 中是无效的

拓展2:@Webserverlet注解用法

 在servlet3.0以后,我们可以不用再web.xml里面配置servlet,只需要加上@WebServlet注解就可以修改该servlet的属性了。

下面是@WebServlet的属性列表。

属性名	类型	描述
name	String	指定Servlet 的 name 属性,等价于 <servlet-name>。如果没有显式指定,则该 Servlet 的取值即为类的全限定名。
value	String[]	该属性等价于 urlPatterns 属性。两个属性不能同时使用。
urlPatterns	String[]	指定一组 Servlet 的 URL 匹配模式。等价于<url-pattern>标签。
loadOnStartup	int	指定 Servlet 的加载顺序,等价于 <load-on-startup>标签。
initParams	WebInitParam[]	指定一组 Servlet 初始化参数,等价于<init-param>标签。
asyncSupported	boolean	声明 Servlet 是否支持异步操作模式,等价于<async-supported> 标签。
description	String	该 Servlet 的描述信息,等价于 <description>标签。
displayName	String	该 Servlet 的显示名,通常配合工具使用,等价于 <display-name>标签。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个能对访问者进行编号、录访问次数、IP、时间的统计制作实例 我以ACCESS库为例子,其实用SQL SERVER库也只要改一下链接库的语句就得啦, 库结构如下 库文件名: CONT.ASP 本来是CONT.MDB但在建好后把扩展名改为了ASP,以防库被下载。 表名:tab 字段名 数据类型 说明 ID 自动编号 访客的编号 IP 文本 用于录访客的IP dat1 日期时间 用于录访客最后访问的时间 dat 日期时间 用于录访客第一次访问的时间 CS 数字,整型 用于录访客访问次数 程序很简单,只有两个文件,dispcont.asp 用于显示统计结果,contpage.asp用于统计信息, 先看看CONTPAGE.ASP 是乍么统计的,代码如下: <% Set Conn=Server.CreateObject("ADODB.Connection") Connstr="DBQ="+server.mappath("cont.asp")+";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};" Conn.Open connstr '*****以上语句用于连接库,cont.asp是库文件名。 keren=request.cookies("keren") '读取cookies,cookies的名为:“keren”,哈哈。。阿余的E文学的臭,只懂用拼音啦。 if keren="" then '判断cookees是不是空,如果是空,那么肯定是新朋友啦,否则是老朋友。 sql="SELECT * FROM tab where id=-1" set rs=server.createobject("ADODB.Recordset") rs.Open sql,conn, 1, 3 rs.addnew '如果是新访客的话,在库中新增一条录。 rs("cs")=1 '下访问次数为1 rs("ip")=request.servervariables("remote_addr") '下IP, rs("dat")=now '下当前的日期时间, rs("dat1")=date '下当前的日期,以后用来做第一次访问的日期, response.cookies("keren")=rs("id") '写入一个cookies,内容就和ID一样。 response.cookies("keren").expires=date+365 '设置cookies的有效日期从现在开始,365天, else '以上是新朋友的处理办法,对老朋友怎么办呢?看下面的: sql="SELECT * FROM tab where id="&keren '到库中去找出我们老朋友的set rs=server.createobject("ADODB.Recordset") rs.Open sql,conn, 1, 3 rs("cs")=rs("cs")+1 '好啦,找到啦,把访问次数加上1 rs("ip")=request.servervariables("remote_addr") '看看他的IP是多少了,下来。 rs("dat")=now '下现在的时间,也就是最后一次访问的时间, response.cookies("keren")=rs("id") '再把cookies写进去,我不知这句是否多余,没有试。 response.cookies("keren").expires=date+365 '设置cookies过期时间,免得一年到了我就不认得他了。 end if rs.update '该的都下了,更新库吧。 rs.close '关闭recordset对象。 set conn=nothing '释放conn,我还是认为connection要随开随关才对,放到SESSION中我认为最不可取。4 %> 好啦,录就做好啦,有二十几行代码,很简单的一个小程序,但我想,高手肯定还有高招,有高招的朋友不忘了教教阿余, 程序写好了,怎么放到页面中呢?很简单,在首页上随便找个地方,加上这行代码:<img src="contpage.asp" width="0" height="0">就行了。 接下来就是把录显示出来,这个能做得比阿余好的人多的是,不过还是来现个丑。 文件名:dispcont.asp , 请看代码: <% Set Conn=Server.CreateObject("ADODB.Connection") Connstr="DBQ="+server.mappath("cont.asp")+";Defau
然之协同办公系统由客户管理(crm)、日常办公(oa)、现金账(cash)、团队分享(team)和应用导航(ips)五大模块组成,主要面向中小团队的企业内部管理,和市面上其他的产品相比,然之协同更专注于提供一体化、精简的解决方案。然之协同办公系统 5.2 更新日志:2019-05-10完成的需求:2541 转账产生的手续费应该录科目为手续费;2569 重新梳理产品线、产品和科目的关系;2570 联系人搜索增加微信字段的搜索;2631 考勤表格底部表格边框设置为1px;2645 报销的时候可以指定收款人;2646 报销可以按照报销人集中报销;2661 登录的时候如果random过期,重新请求session;2663 账搜索表单里面的科目加上/;2664 日历滚动的时候内容不应该超出横向的滚动条;2665 登录页面用户名输入框自动获得焦点;2666 修复弹窗里面出来的编辑器有一个自左到右的展开过程的bug;2667 完善国际化的翻译和排版;2670 调整应用表格边框错位的问题;2671 喧喧里面的应用不应当在然之的应用里面列出;2674 调整添加应用时权限分组的对齐方式;2676 集成最新版本的喧喧客户端。修复的bug:1110 客户导出下次联系时间显示错误;1114 待办日历条目拖动之后会出现两个休息的图标;1115 windows一键安装包default.ztaccess文件内容路径错误;1122 账按照科目使用从属于搜索无效;1123 地盘无法添加文档区块;1124 请假的批量通过功能失效;1125 支出交易时间问题;1126 现金流账里面会产生没有货币单位的录;1127 喧喧里面然之集成扩展应用图标点击后跳转到喧喧官网;1128 请假模块我的审核里面的请假需要点两次通过才能审批成功;1129 组织待办的滚动条位置显示有问题;1130 导入账模板文件权限功能异常;1131 地盘合同删除不受权限控制;1132 在登录页面长时间断开网络连接session过期导致登录失败;1134 动态是搜索表单需要保证默认的检索条件为空;1135 点击项目跳转的地址不对;1137 session目录检查功能不要关闭;1138 禅道一键安装包安装然之异常;1139 考勤补录的批量审核无法通过;1140 然之5.1升级专业版2.8升级失败;1143 设置个人年假,选择起止时间,日历表上部遮挡;1144 CRM应用订单和客户模块下报表和列表数据联动导致的bug;1145 申请报销时,保存出现错误,无法提交;1146 合同列表,合同的创建时间显示不全;1147 客户下次回访时间不能及时更新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值