Spring 3 MVC acessando HttpRequest do controlador

104

Eu gostaria de lidar com os atributos de solicitação e sessão sozinho, em vez de deixar para a primavera @SessionAttributes, para login de manipulação de cookies, por exemplo.

Eu simplesmente não consigo descobrir como posso acessar o HttpRequestde dentro de um controlador, preciso de uma maneira de ir uma camada acima do @RequestAttributee acessar o HttpRequestpróprio. Com o Stripes costumava-se fazer isso implementando um ApplicationContexte chamando getAttribute().

Além disso, passar o HttpServletRequestparâmetro as parece não estar funcionando:

@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println(""+request.getSession().getCreationTime());
    return "home"; 
}

O método acima não imprime nada.

Você tem algum conselho sobre isso?

JBoy
fonte

Respostas:

184

Spring MVC fornecerá o HttpRequest se você apenas adicioná-lo à assinatura do método do controlador:

Por exemplo:

/**
 * Generate a PDF report...
 */
@RequestMapping(value = "/report/{objectId}", method = RequestMethod.GET)
public @ResponseBody void generateReport(
        @PathVariable("objectId") Long objectId, 
        HttpServletRequest request, 
        HttpServletResponse response) {

    // ...
    // Here you can use the request and response objects like:
    // response.setContentType("application/pdf");
    // response.getOutputStream().write(...);

}

Como você pode ver, simplesmente adicionar os objetos HttpServletRequeste HttpServletResponseà assinatura faz com que o Spring MVC passe esses objetos para seu método de controlador. Você também vai querer o HttpSessionobjeto.

EDIT: Parece que HttpServletRequest / Response não está funcionando para algumas pessoas no Spring 3. Tente usar objetos Spring WebRequest / WebResponse como Eduardo Zola apontou.

Eu recomendo fortemente que você dê uma olhada na lista de argumentos suportados que o Spring MVC é capaz de injetar automaticamente em seus métodos de tratamento.

jjmontes
fonte
Olá, obrigado pelas dicas, não sei o que estou fazendo de errado, mas não está funcionando: não imprime nada: @RequestMapping (value = "/") public String home (solicitação HttpServletRequest) {System.out. println ("" + request.getSession (). getCreationTime ()); voltar para "casa"; } Isso deveria pring a quantidade atual pof millis mas não muda, também anotar o método com @RequestBody não muda nada, algum conselho adicional?
obrigado
2
Obrigado @jjmontes pelo link para os argumentos suportados pelo Spring MVC!
Barett
Não sei quase nada sobre Spring, mas tive que adicionar a @Contextanotação antes do argumento para que eles fossem injetados. Pode ser algo novo, não sei, mas pensei em mencioná-lo.
ivarni
81

Eu sei que é uma pergunta antiga, mas ...

Você também pode usar isso em sua aula:

@Autowired
private HttpServletRequest context;

E isso fornecerá a instância atual de HttpServletRequestpara você usar em seu método.

Deividi Cavarzan
fonte
7
Isso não impede que o bean controlador seja um singleton?
jjmontes
2
Os controladores de mola são sempre singletons.
Deividi Cavarzan
16
Isso parece errado - e se o controlador estiver lidando com mais de uma solicitação ao mesmo tempo? O que é o pedido "atual" então?
sbk
2
Esta pergunta tem algumas explicações sobre o que você está pedindo: stackoverflow.com/questions/17235794/…
Deividi Cavarzan
1
Seria muito útil ter algo como getThreadLocalRequest()no GWT's RemoteServiceServletque sempre retorna a solicitação correta mesmo que seja executado em um ambiente altamente concorrente.
Yuriy Nakonechnyy
0
@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println("My Attribute :: "+request.getAttribute("YourAttributeName"));
    return "home"; 
}
SaiSudha HG
fonte