0

我的应用程序中有许多控制器,它们扩展了一个中央控制器类。目前,在每个控制器函数中,我必须将请求传递给此函数,以便我的函数获取当前用户名。这个控制器类是否可以在不需要它作为额外参数的情况下自行获取请求?

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);
4

3 回答 3

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();
    }    
}

这只是一个快速提示,我相信有更多的可能性如何做到这一点。

于 2012-05-04T12:25:46.837 回答
1

HttpServletRequest您可以按如下方式获取电流:

HttpServletRequest request = (HttpServletRequest) RequestContextHolder
    .currentRequestAttributes()
    .resolveReference(RequestAttributes.REFERENCE_REQUEST); 

您可以在控制器的方法中使用此代码,或者使用它将请求公开为请求范围的 bean,并将相应的范围代理作为控制器的字段注入。

于 2012-05-04T12:47:13.777 回答
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;
        }
}
于 2012-05-04T12:39:03.173 回答