2015-11-10 4 views
-1

Я новичок в Spring mvc, я работаю над панелью администрирования веб-проекта.Spring MVC - метод вызова на каждой странице администратора

Вот несколько примеров из моих администратора страниц контроллеров:

@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 (например) для аутентификации администратора и вернуть его на страницу входа, если он не вошел в систему . Конечно, Authenthication - один из примеров, я мог бы использовать больше классов на каждой странице администратора.

Обратите внимание, что мои потребности класса authenthication запрашивать и ссылки сессии (и уверен, что мои другие классы будут нужны другие ссылки, созданные весной)

Я должен знать, что я не могу получить HttpServletRequest и ... с помощью конструктора поэтому я написал другое сопоставление запроса для вызова метода.

Eventough Я могу настроить свои свойства таким образом, но я не могу использовать этот метод для каждого 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"); 
     } 

    } 

Так что мне нужно несколько предложений о том, как написать отображение запроса в контроллере для вызова метода на каждых других контроллерах, которые «админы» страница ребенок?

FYI: Я не думаю о весенней безопасности для этого.

thanks;

ответ

1

Я думаю, вы можете сделать это, внедрив фильтр сервлета.

Например:

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

+0

Согласен с Spring Security. Поскольку SpringMVC используется во всех случаях, HandlerInterceptors (http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/mvc.html#mvc-handlermapping-interceptor) может быть другим вариантом (но не для безопасности!). – jny

+0

Спасибо за отличный ответ и совет. Я должен отметить, что, как я уже упоминал, мне может понадобиться нечто большее, чем весенняя безопасность или аутентификация по умолчанию. Если я не ошибаюсь, я должен написать метод в том же классе с именем 'isAdminUrl', чтобы проверить, введен ли url в url. –

+0

Ну, я подумал, как с этим работать. Спасибо :) –

 Смежные вопросы

  • Нет связанных вопросов^_^