【问题标题】:session validation in jspjsp中的会话验证
【发布时间】:2014-09-29 15:55:48
【问题描述】:

短版-仅在会话已创建时才显示主页

详情

我有一个login.html。它链接到validation.jsp。它检查密码,然后重定向到以下页面。

但我希望仅当以下页面显示 验证是真的。否则,如果有人输入该页面的链接 并发现该页面没有登录,会提示 这样做。

它在 servlet 中运行良好。我在验证页面中创建了一个新会话 并在首页设置request.getSession(false)

但这似乎在 jsp 中不起作用。如果我在页面中设置session=false 指令,那么我根本无法访问会话对象。如果我 明确地做了我在页面中所做的事情,它仍然不起作用!

<%@ page language="java" import="java.io.*"
        contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"
        import="java.util.*;"%>
    <!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=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>


        <%


    session=request.getSession(false);

    if(session==null)
    {
        out.println("please login");


    }

    else
    { 
        out.println("how did it run!!! ??");
        out.println(application.getAttribute("one"));
        out.println(session.isNew());
        out.println(session.getId());

        out.println("<form action='logout.jsp' method='post'>");
        out.println("<input type='submit'>");
        out.println("</form>");

    } 

    %>



    </body>
    </html>

【问题讨论】:

  • 最好不要检查会话的存在,而是检查存在的特定属性(例如用户令牌)。这样您就拥有更多控制权。
  • 哦..像通过会话设置属性然后在主页上检查它?
  • 就像在用户登录时设置一个属性(在他注销时删除它)然后确实在主页上检查它。顺便说一句,有一堆框架(shiro、spring security)可以为你做到这一点。
  • 似乎可行。一旦我完成了 jsp,springs hibernate 将随之而来
  • 谢谢……晚饭后试试这个

标签: java jsp session servlets


【解决方案1】:

JSP 默认创建一个会话。如果您不需要会话,请使用以下

<%@ page session="false" %>

【讨论】:

    【解决方案2】:

    您不使用if(session==null) 来确定是否有人登录。会话通常是自动创建的,此外,您可能希望在登录之前使用会话。您检查特定的会话属性。

    String userid = (String)session.getAttribute("userid");
    if(userid!=null)
    {
        out.print("logged in as:" + userid);
    }
    

    当然要在登录代码中设置:

    session.setAttribute("userid", userid);
    

    在JSP 中也不需要调用request.getSession。在 servlet 中您需要这样做,但在 JSP 中,session 对象已经为您填充了 request.getSession

    编辑:

    当您执行 session=false 指令时,不会声明会话对象,因此您不仅需要设置它,还需要实际声明它:HttpSession session = request.getSession(false); 然后您将获得 session= null,但是为了安全性而依赖它是危险的,因为转到您未设置 session=false 的页面将创建会话,然后您的代码将认为某人已有效登录,而实际上他们没有。即使您确定将 session=false 放在任何地方,您也可能会错过一个地方,或者更有可能的是,您之后的下一个开发人员不会理解您是这样做的,并且安全灾难正在等待发生。

    使用 session=false 旨在提高性能而非安全性。例如。您有一个不关心会话的常见问题解答页面,设置 session=false 这样访问该链接的人就不会创建会话并浪费内存。

    【讨论】:

    • 是的..我得到了它与 sessionAttributes.. 来自 cmets 的人帮助我实现它..
    • 我得到的是 session=false...不是说 getSession(false)!!1
    • 应该但是你把它放在每一页吗?如果不是,则该会话已由较早的页面创建。
    • 我在 servlets 期间做了 wat。在验证期间创建了一次会话。然后在每个页面上禁用了通过 getSession(false) 创建新会话的选项。这样你只有在以下情况下才能查看页面你通过了验证并创建了一个会话
    • 但是如果我在这里设置 session=false ,那么会话对象将变得不可用! ..我在日食中得到红线...所以无法检查任何内容!
    猜你喜欢
    • 2013-11-17
    • 2013-01-04
    • 1970-01-01
    • 2015-12-09
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2014-10-02
    相关资源
    最近更新 更多