如何在Spring中的RestController中最好地处理会话?

时间:2014-07-11 12:31:31

标签: spring session spring-boot

我正在寻找有关如何更优雅地处理会话的建议,而不是我在下面的实现。

基本上我写了一个BaseController,它有一个handleSession()例程,用于初始创建和后续从会话数据中读取。出于显而易见的性能原因,需要此会话数据来存储我不想在每次点击时阅读的各种安全信息。我也不想将其存储在客户端上,或者我只是创建一个新请求以将信息提取回Angular。

CustomerController在每个请求中实现此handleSession()次调用。这意味着我必须把它放在任何地方。

有更优雅的方式来处理这个吗?

BaseController.java

public abstract class BaseController {

    public Logger log = LoggerFactory.getLogger(getClass());

    public void handleSession(HttpSession session) {
        if (session.isNew()) {
            log.info("New session: " + session.getId());
            // TODO: write all session data here?
            session.setAttribute("Parm", "Value");
        } else {
            // TODO: read all session data here?
            log.info("Reused session: " + session.getId() + " Parm is set to: "
                    + session.getAttribute("Parm"));

        }
    }
}

CustomerController.java

@RestController
@RequestMapping("/data/customer")
public class CustomerController extends BaseController {
    @Autowired
    private CustomerRepository customerRepository;

    @RequestMapping("")
    List<Customer> customers(HttpSession session) {
        handleSession(session);
        return customerRepository.getCustomers();
    }

    @RequestMapping("/{company}/{customer}/{division}")
    Customer customer(@PathVariable String company,
            @PathVariable String customer, @PathVariable String division,
            HttpSession session) {
        handleSession(session);
        return customerRepository.getCustomer(company, customer, division);
    }
}

2 个答案:

答案 0 :(得分:2)

也许您可以在Controller中使用@Autowired获取HttpSession信息。如果您将会话信息作为参数传递,则可能会为您的应用程序找到安全漏洞。

为此,请使用以下方法:

@RestController
@RequestMapping("/data/customer")
public class CustomerController extends BaseController {
    @Autowired
    private CustomerRepository customerRepository;

    @Autowired
    private HttpSession httpSession;

您可以从所有请求映射方法中删除HttpSession参数。

答案 1 :(得分:1)

我并没有完全按照您的具体需求进行操作。但是,通常会话初始化是一个跨领域的问题,并且交叉问题通常最好作为servlet过滤器来处理,而不是在每个控制器方法中。