在form action中滥用绝对路径导致session的attribute丢失(无法正常保存)
症状:
刚才在做一个利用session的attribute保存用户的id的实验,login.jsp输入用户id,提交给LoginServlet去数据库验证,然后LoginServlet根据验证情况跳转到相应的页面。
但是发现,LoginServlet中使用了HttpServletRequest.getSession().setAttribute("uid", user_id)却无法成功保存已登录的用户的id,比如说:在welcome.jsp会根据session中
保存的uid attribute显示一些用户特定的欢迎信息,但是welcome.jsp中使用session.getAttribute("uid")却始终返回的是null
在此期间没有关闭浏览器、更没有重新启动服务器,经过简单的debug,session.isNew()返回的是false,但是session.getAttribute("uid")却始终返回null
分析:
分析过程见http://www.cnblogs.com/qrlozte/p/3515881.html
原因是login.jsp中提交到LoginServlet的action写法有误,不应该使用绝对路径,但是为什么使用绝对路径提交form会造成session的attribute无法正常保存我暂时还不清楚
错误的action路径:<form action="http://localhost:8080/site/xxx/LoginServlet">
解决方案:
action改为相对路径即可(server.xml配置的path="/site", docBase="X:\...\WebCotent")
<form action="/site/xxx/LoginServlet">
为了具体化我遇到的问题,我将简化后的代码列举如下:
/site/xxx/login.jsp
(注意这里的action使用的是绝对路径,你会发现,提交之后,uid并没有保存到session中(你可以在不关闭浏览器的情况下刷新login.jsp,你可以看到request.getSession().getAttribute("uid")返回null),而且session也没有被销毁(你可以用session.isNew()验证),怎么解决?action改为"/site/xxx/LoginServlet"或者"LoginServlet"即可)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="http://localhost:8080/site/xxx/LoginServlet" method="post">
attr:<input type="text" name="uid"><br>
<input type="submit" value="提交"><input type="reset" value="重置">
</form>
<%=request.getSession().getAttribute("uid") %>
</body>
</html>
/site/xxx/yyy/welcome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=request.getSession().getAttribute("uid") %>
</body>
</html>
/site/xxx/LoginServlet
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.getSession().setAttribute("uid", req.getParameter("uid"));
req.getRequestDispatcher("yyy/welcome.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
web.xml
<servlet>
<servlet-name>loginServlet</servlet-name>
<servlet-class>
org.foo.servletdemo.LoginServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/xxx/LoginServlet</url-pattern>
</servlet-mapping>
在form action中滥用绝对路径导致session的attribute丢失(无法正常保存)的更多相关文章
- form action中如何填写相对目录
举个例子,你在web-root文件夹有个a.html需要向/web-root/jsp/b.jsp提交form,怎么做 网上看到了一个解决方案,但是要求a是jsp页面而不是html页面 <%!St ...
- springMvc <form action="">提交跳转路径问题
表单提交后,action的URL写的是, login/login.do,每次跳转后都变成login/ login/login.do,很显然是相对路径没有搞清楚. 应该弄清楚相对路径,并在JSP代码中加 ...
- Spring Boot+AngularJS中因为跨域导致Session丢失
http://blog.csdn.net/dalangzhonghangxing/article/details/52446821 如果还在为跨域问题烦恼,请查看博主的 解决angular+sprin ...
- ASP.NET 程序中删除文件夹导致session失效解决问题
在Global中 Application_Start 添加 如: void Application_Start(object sender, EventArgs e) { //在 ...
- web工程中的各种路径(eclipse开发)
目前遇到的 web 工程中要写url和路径的文件有 webContent中.jsp/.html :action src中的servlet类 : 映射地址.重定向.请求转发.访问资源文件(webCont ...
- struts2中form提交到action中的中文参数乱码问题解决办法(包括取中文路径)
我的前台页是这样的: <body> <form action="test.action" method="post"> ...
- 关于Action中ValidateXXX方法校验一次失败后\导致以后一直返回input视图的情况
问题: 使用struts2的validateXXX()进行验证,出错后自动返回之前的画面,但是Form中的数据全部丢失了,如何才能保存出错前的Form是要解决的问题. 调查: 调查后发 ...
- 表单enctype不对导致action中无法接受数据
表单enctype不对导致action中无法接受数据 描述:在用ssh开发项目的时候,可能会遇到一个问题, 那就是明明我的表单字段和JavaBean类中的字段都是一一对应的,而且action也实现了模 ...
- form action 相对路径出问题
http://www.w3chtml.com/html5/tag/base.html <base> 标签为页面上的所有链接规定默认地址或默认目标. 通常情况下,浏览器会从当前文档的 URL ...
随机推荐
- Kettle中txt类型数据源作为输入需要注意的地方
文本类型在kettle中作为数据源的时候,需要注意的几点,ktr的机构如下图 1:txt文本的格式 2:文本输入控件的设置 --2.1:选择文件所在物理位置 --2.2:设置分隔符,注意头部数量去掉, ...
- 近200篇机器学习&深度学习资料分享(含各种文档,视频,源码等)(1)
原文:http://developer.51cto.com/art/201501/464174.htm 编者按:本文收集了百来篇关于机器学习和深度学习的资料,含各种文档,视频,源码等.而且原文也会不定 ...
- 分治算法——Karastsuba算法
分治(Divide and Conquer)算法:问题能够分解为子问题,每一个问题是能够独立的解决的,从子问题的解能够构建原问题. Divide:中间分.随机分.奇偶分等,将问题分解成独立的子问题 C ...
- [ES6] 05. The leg keyword -- 3. Block Scope
In ES6, IIFE is not necessary: // IIFE写法 (function () { var tmp = ...; ... }()); // 块级作用域写法 { let tm ...
- JavaScript计算两个日期的时间差
/** * * @param startTime * @param endTime * @param diffType * @returns {Number|number} * @constructo ...
- JAVA设计模式之 訪问者模式【Visitor Pattern】
一.概述 訪问者模式是一种较为复杂的行为型设计模式,它包括訪问者和被訪问元素两个主要组成部分.这些被訪问的元素通常具有不同的类型,且不同的訪问者能够对它们进行不同的訪问操作.在使用訪问者模式时,被訪问 ...
- android 程序更新(没有sdcard)
今天总结一下我们写的程序需要更新(默认用户已经安装上旧版本了),而用户更新时却没有sdcard的情况,如果有sdcard,那就不用废话了... 先说一下软件更新的基本原理,从服务器下载一个程序的apk ...
- AVAudioPlayer播放在线音频文件
AVAudioPlayer播放在线音频文件 一:原里: AVAudioPlayer是不支持播放在线音频的,但是AVAudioPlayer有一个 initWithData的方法:我们可以把在线音频转换为 ...
- 查看IE浏览器安装的插件
请移步至文章:http://blog.sina.com.cn/u/6452627072
- lucene 学习一
索引工具的三部分 1.索引部分 2.分词部分 3.搜索部分 查看索引的工具:luke java -jar fileName.jar 目标:为文件夹的所有的文档生成索引并搜索它 package co ...