Servlet中的会话管理和登录后重定向

版权声明:访问者可将本人原创或翻译内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本人的合法权利。除此以外,将本人原创或翻译内容用于其他用途时,须征得本人的同意。 https://blog.csdn.net/m0_38063172/article/details/83011768

最近在做一个简单的人员管理系统,在信息录入时需要先验证当前会话是否有效,是不
是登录用户在操作。如果把验证的步骤放在提交的时候,那么如果当前会话无效,填写
表单就会是一种对用户时间的浪费,所以在用户打开填写表单页面时就要判断当前会话
是否有效,如果当前的会话状态是无用户登录,就跳转到登录页面。

刚开始想着在提交表单页面检查session,如果session.isNew()为真,就跳到登录页面。
结果发现不起作用,从index.jsp过去后会跳到登录页面,但是如果这时候不登录再进一
次表单页面,就不会再跳转了。然后用session==null来判断,结果也不行,网上搜了一
下,原来是因为在jsp中session是隐藏对象,jsp中的session是用request.getSession(true)
来获取的,也就是说如果没有session的话会创建session,不能用session的存在与否来判
断会话是否有效。而且session是跟整个web应用相关的,而不是跟页面相关。

然后基于上面的对jsp和session的新认识,我决定在index.jsp和input_form.jsp中加入
<% @page session=“false” %>,这样的话浏览器中没有保存session去访问它们时它们不
会主动生成session,可以通过request.getSession(false)来获取会话中的session,然后用
session==null来判断需不需要跳转到登录页面了,登录成功后会创建session,这时在
input_form.jsp中获取的session不为空,不用跳转到登录页面。

实现了从input_form.jsp到login.html跳转后,我又希望能在登录成功后自动跳转到
input_form.jsp,也可以把input_form.jsp写到loginServlet里面,但是那样硬编码的弊端显
而易见,其他需要登录的页面在登录成功后也会跳转到表单页面。最后在网上找到了可以参
考的代码
。实现了既定的需求。

input_form.jsp中的代码如下:

<%
    String user = (String)session.getAttribute("current_user");//没登录时的session没有current_user属性。

    String queryUrl = request.getQueryString() == null ? "" : ("?" + request.getQueryString());//获取参数
    String requestUrl = request.getRequestURL().toString() + queryUrl;//httpRequest.getServletPath(),获取链接
    if (session.getAttribute("original_link") == null) {
        session.setAttribute("original_link", requestUrl);
    }

    if (user == null) {
        response.sendRedirect("login.html");
    }
%>

loginServlet中相关的代码如下:

if (Validate.checkUser(username, password)) {
            HttpSession session = request.getSession(true);
            session.setAttribute("current_user", username);
            String original_link = (String)session.getAttribute("original_link");
            if (original_link == null) {//没有original_link属性说明是直接从登录页面过来,登录成功后跳转到首页。
                response.sendRedirect("index.jsp");
            } else {
                response.sendRedirect(original_link);
            }
}

总结

自己尝试写项目时要多思考,一步步优化功能的实现。没动手的时候想一想是一个比较
大的工程,但是沉下心来开始做的时候会发现,还是有处下手的,从一个小模块开始
做,遇到问题就上谷歌上百度。当你做完一个个模块时,突然发现自己已经可以搭建起
很漂亮的建筑了。

猜你喜欢

转载自blog.csdn.net/m0_38063172/article/details/83011768