【问题标题】:How to set a session attribute in Javascript and then use it in a Spring Controller?如何在 Javascript 中设置会话属性,然后在 Spring Controller 中使用它?
【发布时间】:2017-07-15 01:54:07
【问题描述】:

我正在尝试读取之前通过 Javascript 设置的 Java 会话属性的值。属性设置正确,因为 Chrome 显示 here
但是我之后似乎无法在Controller中获取此属性值。 我觉得我错过了整个会话的工作原理。
因为当我调试代码时,它只是显示我的 MainController.java 存储在其中。

我的代码

main.js

function setSessionCounter(count){
    listElementsCounter = count;
    sessionStorage.setItem("listElementsCounter", listElementsCounter);
}

MainController.java

@RestController
@EnableWebMvc
@Scope("session")
public class MainController {

...

@RequestMapping(value = "/search", method = RequestMethod.POST)
    public ModelAndView showSearchResults(@ModelAttribute("SpringWeb")SearchParameters sp, ModelMap model, HttpSession session) throws SQLException {

        //Build SQL without the counter
        int elementsCount = (Integer)(session.getAttribute("listElementsCounter"));
        ...
    }

我也在Controller中这样尝试过:

@RequestMapping(value = "/search", method = RequestMethod.POST)
    public ModelAndView showSearchResults(@ModelAttribute("SpringWeb")SearchParameters sp, ModelMap model, HttpServletRequest request) throws SQLException {
        HttpSession session = request.getSession();
        //Build SQL without the counter
        int elementsCount = (Integer)(session.getAttribute("listElementsCounter"));
        ...
    }

如果有人能指出我做错了什么,我将不胜感激(:

【问题讨论】:

  • 您的浏览器中正在运行 .js?
  • @DaveH 是的。 .js 工作得很好,并设置了我想要的值。但它不在我的控制器中的HttpSession 中。
  • 浏览器上的会话存储和服务器上的会话存储之间没有自动连接。如果你想从浏览器获取信息到服务器,你需要发送它,一般通过 http PUT 或 POST

标签: javascript java spring session


【解决方案1】:

JavaScript在客户端执行,不能存储会话属性。

您可以使用例如 Ajax 调用将信息从客户端传递到服务器,并在服务器端(控制器)使用 session.setAttribute 命令存储数据。

【讨论】:

  • 感谢您的回答!我将其标记为正确,因为我无法标记评论。 DaveH 已经说过了。我知道,但我不认为在客户端有一个会话,在服务器端有一个会话。完全按照您提到的方式进行,并且效果很好。 :)
【解决方案2】:

我认为这将帮助您将 ajax 请求发送到您的 spring 控制器

在 Javascript 中

function myFunction() {
console.log("clicked on submit button");

var data = {"listElementsCounter":count}

$.ajax({
    type: "POST",
    url: "testurl",
    data:data, 
    success :function(result) {
        //anything you want to do after success

         }  
});

}

在控制器中

@RequestMapping(value="/testurl" , method=RequestMethod.POST)
@ResponseBody
public void process(@RequestParam("listElementsCounter") Integer count) {

//do whatever you want to do for the count



}

【讨论】:

  • @lakeu-one 最佳答案
猜你喜欢
  • 2018-08-26
  • 2021-08-11
  • 2013-08-04
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 2012-12-23
相关资源
最近更新 更多