控制器库直接访问HttpServletRequest

时间:2012-05-04 11:58:14

标签: java spring-mvc

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

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

3 个答案:

答案 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;
        }
}