如何在不使用 HttpServletRequest 会话的情况下更新 @SessionAttributes,使用 Spring MVC
How to update @SessionAttributes without using the HttpServletRequest session, using 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 && 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;
}
}```
@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 注释控制器 class 以将相同的模型属性 (requestObject) 放入 Spring 会话中。
@Controller
@SessionAttributes("requestObject")
public class MyController {
...
}
我正在尝试像这样更新我的 @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 && 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;
}
}```
@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 注释控制器 class 以将相同的模型属性 (requestObject) 放入 Spring 会话中。
@Controller
@SessionAttributes("requestObject")
public class MyController {
...
}