症状:

  刚才在做一个利用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丢失(无法正常保存)的更多相关文章

  1. form action中如何填写相对目录

    举个例子,你在web-root文件夹有个a.html需要向/web-root/jsp/b.jsp提交form,怎么做 网上看到了一个解决方案,但是要求a是jsp页面而不是html页面 <%!St ...

  2. springMvc <form action="">提交跳转路径问题

    表单提交后,action的URL写的是, login/login.do,每次跳转后都变成login/ login/login.do,很显然是相对路径没有搞清楚. 应该弄清楚相对路径,并在JSP代码中加 ...

  3. Spring Boot+AngularJS中因为跨域导致Session丢失

    http://blog.csdn.net/dalangzhonghangxing/article/details/52446821 如果还在为跨域问题烦恼,请查看博主的 解决angular+sprin ...

  4. ASP.NET 程序中删除文件夹导致session失效解决问题

    在Global中  Application_Start 添加 如: void Application_Start(object sender, EventArgs e)    {        //在 ...

  5. web工程中的各种路径(eclipse开发)

    目前遇到的 web 工程中要写url和路径的文件有 webContent中.jsp/.html :action src中的servlet类 : 映射地址.重定向.请求转发.访问资源文件(webCont ...

  6. struts2中form提交到action中的中文参数乱码问题解决办法(包括取中文路径)

    我的前台页是这样的: <body>      <form action="test.action" method="post">     ...

  7. 关于Action中ValidateXXX方法校验一次失败后\导致以后一直返回input视图的情况

    问题:     使用struts2的validateXXX()进行验证,出错后自动返回之前的画面,但是Form中的数据全部丢失了,如何才能保存出错前的Form是要解决的问题. 调查:     调查后发 ...

  8. 表单enctype不对导致action中无法接受数据

    表单enctype不对导致action中无法接受数据 描述:在用ssh开发项目的时候,可能会遇到一个问题, 那就是明明我的表单字段和JavaBean类中的字段都是一一对应的,而且action也实现了模 ...

  9. form action 相对路径出问题

    http://www.w3chtml.com/html5/tag/base.html <base> 标签为页面上的所有链接规定默认地址或默认目标. 通常情况下,浏览器会从当前文档的 URL ...

随机推荐

  1. Kettle中txt类型数据源作为输入需要注意的地方

    文本类型在kettle中作为数据源的时候,需要注意的几点,ktr的机构如下图 1:txt文本的格式 2:文本输入控件的设置 --2.1:选择文件所在物理位置 --2.2:设置分隔符,注意头部数量去掉, ...

  2. 近200篇机器学习&深度学习资料分享(含各种文档,视频,源码等)(1)

    原文:http://developer.51cto.com/art/201501/464174.htm 编者按:本文收集了百来篇关于机器学习和深度学习的资料,含各种文档,视频,源码等.而且原文也会不定 ...

  3. 分治算法——Karastsuba算法

    分治(Divide and Conquer)算法:问题能够分解为子问题,每一个问题是能够独立的解决的,从子问题的解能够构建原问题. Divide:中间分.随机分.奇偶分等,将问题分解成独立的子问题 C ...

  4. [ES6] 05. The leg keyword -- 3. Block Scope

    In ES6, IIFE is not necessary: // IIFE写法 (function () { var tmp = ...; ... }()); // 块级作用域写法 { let tm ...

  5. JavaScript计算两个日期的时间差

    /** * * @param startTime * @param endTime * @param diffType * @returns {Number|number} * @constructo ...

  6. JAVA设计模式之 訪问者模式【Visitor Pattern】

    一.概述 訪问者模式是一种较为复杂的行为型设计模式,它包括訪问者和被訪问元素两个主要组成部分.这些被訪问的元素通常具有不同的类型,且不同的訪问者能够对它们进行不同的訪问操作.在使用訪问者模式时,被訪问 ...

  7. android 程序更新(没有sdcard)

    今天总结一下我们写的程序需要更新(默认用户已经安装上旧版本了),而用户更新时却没有sdcard的情况,如果有sdcard,那就不用废话了... 先说一下软件更新的基本原理,从服务器下载一个程序的apk ...

  8. AVAudioPlayer播放在线音频文件

    AVAudioPlayer播放在线音频文件 一:原里: AVAudioPlayer是不支持播放在线音频的,但是AVAudioPlayer有一个 initWithData的方法:我们可以把在线音频转换为 ...

  9. 查看IE浏览器安装的插件

      请移步至文章:http://blog.sina.com.cn/u/6452627072  

  10. lucene 学习一

    索引工具的三部分 1.索引部分 2.分词部分 3.搜索部分 查看索引的工具:luke   java -jar fileName.jar 目标:为文件夹的所有的文档生成索引并搜索它 package co ...