Spring MVC - 在每个管理页面上调用方法

Spring MVC - calling method on every admin pages

我是 spring mvc 的新手,我正在开发 Web 项目管理面板。

这是我的管理页面控制器的一些示例:

@Controller
@RequestMapping("/admin/article/**")
public class ArticleController {
    private ArticleDao articleDao;
    private String fileName;
    private String baseUrl;

    public ArticleController() {
        articleDao = ArticleDaoFactory.create();
    }
    @RequestMapping(value = "/admin/article",method = RequestMethod.GET)
    public String doGet(ModelMap model,HttpServletRequest request,ArticleForm articleForm) {
        //some codes
    }


    @RequestMapping(value = "/admin/article/add",method = RequestMethod.GET)
    public String doGetAdd(ModelMap model,ArticleForm articleForm) {
        model.addAttribute("article", articleForm);
        return "admin/articleAdd";
    }
    @RequestMapping(value = "/admin/article/add",method = RequestMethod.POST)
    public String doPost(@ModelAttribute ArticleForm article, BindingResult result ,ModelMap model){
        //some codes
    }

    @RequestMapping(value = "/admin/article/edit/{id}",method = RequestMethod.GET)
    public String getEdit(ModelMap model, @PathVariable("id") int id) {
        //some codes
    }

    @RequestMapping(value = "/admin/article/edit/{id}",method = RequestMethod.POST)
    public String postEdit(ModelMap model, @PathVariable("id") int id, ArticleForm article, BindingResult result) {
        //some codes
    }
    @RequestMapping(value = "/admin/article/delete/{id}",method = RequestMethod.GET)
    public void getDelete(ModelMap model, @PathVariable("id") int id, HttpServletResponse response) {
        //some codes
    }
}

现在我需要在另一个名为 AdminController 的控制器中进行另一个映射(例如)以验证管理员并在他未登录时将他带到登录页面。可以肯定的是,身份验证就是一个例子,我可能想使用更多 classes 在每个管理页面上。

请注意,我的身份验证 class 需要请求和会话引用(当然我的其他 classes 将需要由 spring 创建的其他引用)

我知道我无法获取 HttpServletRequest 并且...使用构造方法,所以我编写了另一个请求映射来调用方法。

尽管我可以用这种方式设置我的属性,但我不能对每个管理员都使用这种方法url。

@Controller
@RequestMapping(value = "/admin/**",method = RequestMethod.GET)
public class AdminController {
    Authentication authentication;
    HttpServletRequest request;
    HttpSession session;
    HttpServletResponse response;
    public void checkAndSet(HttpSession session,HttpServletRequest request,HttpServletResponse response) {
        authentication = new Authentication(session,request);
        this.request = request;
        this.session = session;
        this.response = response;
        if(!authentication.isLoggedIn()){
            System.out.println(" I'm not logged in");
            response.setHeader("Location","/admin/login");
        }

    }

所以我需要一些关于如何在控制器中编写请求映射以调用作为 'admin' 页面子项的每个其他控制器的方法的建议?

仅供参考:我不考虑 spring 安全性。

谢谢;

我想你可以通过实现一个 servlet 过滤器来做到这一点。

例如:

public class AuthenticationFilter extends GenericFilterBean {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        String url = request.getServletPath();
        HttpSession session = request.getSession(false);
        Authentication authentication = new Authentication(session,request);


        if (isAdminUrl(url) && !authentication.isLoggedIn()) {
            res.sendRedirect/admin/login");
        }
        chain.doFilter(req, res);
    }
}

然后,您必须实施方法 isAdminUrl(String url) 以确定是否要应用您的过滤器。

否则我强烈推荐你看看Spring Security