Как обновить атрибуты @sessionAttributes без использования сеанса HttpServletRequest, используя Spring MVC

#java #spring #spring-boot #spring-mvc

Вопрос:

Я пытаюсь обновить свой @SessionAttributes таким образом, но когда я .jsp перезагружаюсь, любые изменения происходят с моими атрибутами. Я не понимаю разницы между HttpServletRequest сеансом и HttpSession , единственное, что я знаю HttpSession , это то, что, по моим данным, это 30 минут web.xml .

 @Controller
@ControllerAdvice
@SessionAttributes({"Usuario", "ImagenUsuario"})
public class UserController {

  private UsuarioServicio usuario_servicio;
    
  @Autowired(required=true)
  @Qualifier(value="UsuarioServicio")
  public void setUsuarioServicio(UsuarioServicio us){
    this.usuario_servicio = us;
  }
  
  @RequestMapping(value = "/ActualizarImagenPerfil", method = { RequestMethod.GET, RequestMethod.POST })
  public ModelAndView ActualizarImagenPerfil(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
    ModelAndView mav = null;
    Usuario usuario = (Usuario) session.getAttribute("Usuario");
    Map<String, String> map = new HashMap<>();
    
    if(session.getAttribute("Usuario") != null) {
      if(request.getHeader("X-Requested-With") != null amp;amp; request.getHeader("X-Requested-With").equals("XMLHttpRequest")) {
        map.put("redirect", "true");

        try{
          UsersProfileImage profile_image = new UsersProfileImage();
          profile_image.RemoveImage(usuario.getId()   ".");
          usuario.setImagenPerfil(profile_image.SaveImage(usuario.getId(), request.getParameter("imagebase64")));
          usuario_servicio.ActualizarFotoPerfil(usuario.getId(), usuario.getImagenPerfil());
          session.setAttribute("ImagenUsuario", profile_image.Base64ImageRetrieve(usuario.getImagenPerfil()));
          session.setAttribute("Usuario", usuario);
          
          map.put("url", request.getContextPath()   "/R_MProfile/1");
        } catch(Exception e) {
          map.put("url", request.getContextPath()   "/E_Login");
        }
        
        try {
          ObjectMapper mapper = new ObjectMapper();
          response.setContentType("text/html; charset=UTF-8");
          response.getWriter().write(mapper.writeValueAsString(map));
          response.getWriter().flush();
        } catch (IOException ex) {
          Logger.getLogger(ProfileController.class.getName()).log(Level.SEVERE, null, ex);
        }
          
      } else {
        mav = new ModelAndView("forward:/R_MProfile");
      }

    } else {
      
      mav = new ModelAndView("forward:/Login");
    }

    return mav;
  }
  
  @RequestMapping(value = "/BorrarImagenPerfil", method = RequestMethod.GET)
  public ModelAndView BorrarImagenPerfil(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
    ModelAndView mav;
    Usuario usuario = (Usuario) session.getAttribute("Usuario");

    if(session.getAttribute("Usuario") != null) {
      try{
          UsersProfileImage profile_image = new UsersProfileImage();
          profile_image.RemoveImage(usuario.getId()   ".");
          usuario_servicio.BorrarFotoPerfil(usuario.getId());
          usuario.setImagenPerfil(null);
          
          mav = new ModelAndView("forward:/R_MProfile/2");
      } catch(Exception e) {
        mav = new ModelAndView("forward:/R_MProfile");
      }
      
    } else {
      mav = new ModelAndView("forward:/Login");
    }
    
    return mav;
  }

}```
 

Комментарии:

1. HttpServletRequest.getSssion это то же HttpSession самое, что . Если это не был ваш вопрос, пожалуйста, уточните свой вопрос, поскольку он неясен.

2. большое вам спасибо, я понятия не имел, но теперь все хорошо работает над моим кодом!

Ответ №1:

@sessionAttributes позволяет вам сообщить Spring, какие из атрибутов вашей модели также будут скопированы в HttpSession перед отображением представления.

Сценарий JSP для отображения атрибутов HttpSession.

 <h3>Session Scope (key==values)</h3>
<%
  java.util.Enumeration<String> sessEnum = request.getSession()
    .getAttributeNames();
  while (sessEnum.hasMoreElements()) {
    String s = sessEnum.nextElement();
    out.print(s);
    out.println("=="   request.getSession().getAttribute(s));
%><br />
<%
  }
%>
 

Аннотируйте класс контроллера с помощью атрибутов @sessionAttributes, чтобы поместить тот же атрибут модели (RequestObject) в весеннюю сессию.

 @Controller
@SessionAttributes("requestObject")
public class MyController {
  ...
}