在声明会话的 servlet 中或在将使用其值的 jsp 页面中使会话无效更好


在声明会话的

servlet 中或在将使用其值的 JSP 页面中使会话无效更好吗?

我在下面发布servlet的代码 -

package Controller.UploadInfo;
import File.FileOperations;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import Controller.DatabaseException.*;

public class AttendenceInfoUpload extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
            HttpSession session;
            if (FileOperations.fileUpload(request)) {
                try {
                    FileOperations.excelToAttendence();  
                    request.getRequestDispatcher("UploadSuccess.jsp").forward(request, response);

                } catch (DBException e) {
                   session = request.getSession(true);
                   session.setAttribute("exception",e);
                   request.getRequestDispatcher("FileUpload.jsp").forward(request, response);
                   session.invalidate();
                }
            } else {
                session = request.getSession(true);
                session.setAttribute("exception"," File Upload Failed " );
                request.getRequestDispatcher("FileUpload.jsp").forward(request, response);
            }
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}

在上面给定的 servlet 中,我在 catch 块中的getRequestDispatcher()之后立即使会话无效。尽管代码可以正常工作,但我担心的是它是否会导致异常消息在 JSP 页面中显示之前丢失。或者,最好在 JSP 页面中使 servlet 中声明的会话无效,在该页面中将显示其值。

JSP 页面 -

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import = "java.io.*" %>

<!DOCTYPE html>
<html>
    <head>
        <title>TODO supply a title</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <h1>Excel File Upload Example</h1>
        <form name="form1" method="post" action="AttendenceInfoUpload" enctype="multipart/form-data">
            <table border="1">
                <col width="120">                                
                <tr>
                    <td>Upload Excel File:</td>
                    <td><input type="file" name="Select File"/></td>
                </tr>               
                <tr>
                    <td>&nbsp;</td>
                    <td><input name="" type="submit" value="upload" /></td>                    
                </tr>
            </table>
        </form>        
        <c:if test="${not empty exception}"> 
            <label>
                <font color="red">   
                <c:out value="Error:${exception}"></c:out>
                </font>            
            </label>                                                    
        </c:if>        
    </body>    
</html>

人们也可以提出替代解决方案吗?

最好的解决方案可能是使 servlet 中的会话失效,但要确保 JSP 所需的任何值都存储在请求中而不是会话中。我之所以这样说,是因为最佳实践是将所有逻辑放在 bean 或 servlet 代码中,并保留 JSP 仅用于布局。

无需使会话失效。此外,无需使用会话属性。如果要转发到错误页面,可以使用请求属性。大量使用会话是一种不好的做法,因为它需要大量内存来利用您放入其中的变量。

} catch (DBException e) {
    request.setAttribute("exception",e);
    request.getRequestDispatcher("FileUpload.jsp").forward(request, response);
}

正如我所说,当您要转发到错误页面时,使会话无效不是一个好做法。即使 JSP 页面呈现在同一线程中,其他可以使用同一会话的线程也可能不起作用。会话失效后,您不能使用会话变量。但是,这种情况很少发生,但在呈现 JSP 时,其他请求可能会使会话无效。

最新更新