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
我是 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