我的应用程序中有许多控制器可以扩展中央控制器类。目前,在每个控制器函数中,我必须将请求传递给此函数,以便我的函数获取当前用户名。这个控制器类是否可以自己获取请求,而不需要将其作为额外参数?
public class Controller {
protected String environment;
public Controller () {
}
public ModelAndView prepareModel (HttpServletRequest request, ModelAndView model) {
contentDao.clearExpiredLocks();
model.addObject("currentUser", contentDao.findUser(request.getRemoteUser()));
//define current environment
this.environment = (request.getRequestURL().indexOf("localhost") > 0) ? "dev" : "uat";
model.addObject("environment", this.environment);
答案 0 :(得分:1)
您可以使用以下内容:
public abstract class AbstractController {
protected HttpServletRequest req
protected AbstractController(HttpServletRequest req) {
this.req = req
}
}
public class ConcreteController extends AbstractController {
protected ConcreteController(String name) {
super(name);
}
private void getUserName(){
this.req.getRemoteUser();
}
}
这只是一个快速提示,我相信如何做到这一点有更多的可能性。
答案 1 :(得分:1)
您可以按如下方式获取当前HttpServletRequest
:
HttpServletRequest request = (HttpServletRequest) RequestContextHolder
.currentRequestAttributes()
.resolveReference(RequestAttributes.REFERENCE_REQUEST);
您可以在控制器的方法中使用此代码,或使用它将请求作为请求范围的bean公开,并将相应的作用域代理注入控制器的字段。
答案 2 :(得分:0)
就我而言,我所做的是:我获得用户MainController.getLoginPerson()并在所有控制器中使用所有用户的信息。所有控制器都扩展到MainController。 这是方法MainController.getLoginPerson():
MainController.getLoginPerson() {
// calls to authentication service method
authenticationService.getLoginPerson();
}
authenticationService.getLoginPerson() {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null) {
return (UserPrincipalImpl) auth.getPrincipal();
} else {
return null;
}
}