Хранение HttpServletResponse и HttpServletRequest в виде двух полей HttpServlet - PullRequest
3 голосов
/ 15 марта 2011

Является ли хорошей практикой / безопасным временно хранить HttpServletRequest и HttpServletResponse как два поля HttpServlet (см. Ниже)? Если нет, то почему?

import java.io.IOException;    
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Test extends HttpServlet
    {
    private HttpServletRequest req;
    private HttpServletResponse resp;
    @Override
    protected void doPost(
            HttpServletRequest req,
            HttpServletResponse resp
            )
            throws ServletException, IOException
        {
        try
            {
            this.req=req;
            this.resp=resp;
            do1();
            do2();
            }
        finally
            {
            this.req=null;
            this.resp=null;
            }
        }

    private void do1() throws ServletException, IOException
        {
        //use req resp
        }
    private void do2() throws ServletException, IOException
        {
        //use req resp
        }
    }

или я должен вызвать что-то вроде:

do1(req,resp);
do2(req,resp);

1 Ответ

8 голосов
/ 15 марта 2011

Это хорошая практика / безопасно временно хранить HttpServletRequest и HttpServletResponse как два поля HttpServlet (см. Ниже)?

Нет!

Если нет, то почему?

Поскольку сервлеты должны быть поточно-ориентированными.Несколько потоков будут проходить через этот объект сервлета одновременно.Если вы сохраняете запрос / ответ в полях, ваша безопасность потока выходит за пределы окна.

Не поддавайтесь искушению использовать этот вид ярлыков только для того, чтобы избежать визуальной неприятности передачи параметров.

Если вам действительно нужно избегать параметров, сохраните запрос / ответ в полях java.lang.ThreadLocal.Это все еще плохая практика, но, по крайней мере, теперь она будет поточно-ориентированной.

...