我正在寻找有关如何更优雅地处理会话的建议,而不是我在下面的实现。
基本上我写了一个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);
}
}
答案 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过滤器来处理,而不是在每个控制器方法中。