在我们预计的系统中,登录后不仅仅是一种角色,可能这个用户是普通用户,其他的某个用户又是管理员了。
那么在接下来,我们就要创建一组页面,来实现每个不同角色的用户登录之后,可以有属于自己这个角色的页面。
同时页面的结构也要规划好,对于头部和尾部要做到复用。
1、先来复习一下我们之前创建的数据库。
看到 user_role_type 那一列了吧,正是我们拿来标识用户。
这里我们约定1为管理员(admin),2为普通用户(user)。
2、然后我们首先在 web/WEB-INF 创建一下页面文件,文件结构和相关文件如下。
admin 文件夹– 主要放置管理员角色相关的页面的主要内容
user 文件夹– 主要放置用户角色相关的页面的主要内容
includes 文件夹–主要放置以上两种角色页面的公共资源文件,比如头部和尾部文件。
相关文件内容如下
注意:
<jsp:include flush="true" page="../includes/admin/header.jsp" />
include 就是在这里引用其他文件的内容。flush 就是缓冲器满了就输出,免得爆掉。page 就是你要引用的页面。
admin/index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <jsp:include flush="true" page="../includes/admin/header.jsp" /> <p> 首页 </p> <jsp:include flush="true" page="../includes/admin/footer.jsp" />
admin/page1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <jsp:include flush="true" page="../includes/admin/header.jsp" /> <p> 页面1 </p> <jsp:include flush="true" page="../includes/admin/footer.jsp" />
admin/page2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <jsp:include flush="true" page="../includes/admin/header.jsp" /> <p> 页面2 </p> <jsp:include flush="true" page="../includes/admin/footer.jsp" />
user/index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <jsp:include flush="true" page="../includes/user/header.jsp" /> <p> 首页 </p> <jsp:include flush="true" page="../includes/user/footer.jsp" />
user/page1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <jsp:include flush="true" page="../includes/user/header.jsp" /> <p> 页面1 </p> <jsp:include flush="true" page="../includes/user/footer.jsp" />
includes/admin/footer.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <p>您当前在管理员页面</p> </body> </html>
includes/admin/header.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>管理员页面</title> </head> <body> <p> <a href="/admin">首页</a> <a href="/admin/page1">页面1</a> <a href="/admin/page2">页面2</a> <a href="/logout">登出</a> </p>
includes/user/footer.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <p>您当前在用户页面</p> </body> </html>
includes/user/header.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>用户页面</title> </head> <body> <p> <a href="/user">首页</a> <a href="/user/page1">页面1</a> <a href="/logout">登出</a> </p>
好的,这些就是我们需要的页面文件了。
3、然后我们在 Controller 里创建两个子包,分别叫 Admin 和 User,里面分别放 AdminPageController 和 UserPageController,对上面的页面资源进行展示。
Admin/AdminPageController
package Controllers.Admin; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class AdminPageController { @RequestMapping("/admin/page1") public String page1(Model model) { return "admin/page1"; } @RequestMapping("/admin/page2") public String page2(Model model) { return "admin/page2"; } @RequestMapping("/admin") public String index(Model model) { return "admin/index"; } }
User/UserPageController
package Controllers.User; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class UserPageController { @RequestMapping("/user/page1") public String page1(Model model) { return "user/page1"; } @RequestMapping("/user") public String index(Model model) { return "user/index"; } }
4、然后我们来改下我们之前的 IndexController,主要对 index 方法进行修改。
package Controllers; import Models.UsersEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpSession; @Controller public class IndexController { @RequestMapping("/") public String index(Model model, HttpSession session) { // 获取用户 UsersEntity user = (UsersEntity) session.getAttribute("user"); //获取用户身份进行跳转 switch(user.getUserRoleType()) { case 1: //redirect:就是跳转 后面跟着要跳转的路径 return "redirect:/admin/"; case 2: return "redirect:/user/"; default: return "index"; } } @RequestMapping("/logout") public String logout(Model model, HttpSession session) { session.removeAttribute("user"); return "index/logout"; } }
5、改好之后,我们再来创建两个拦截器 AdminInterceptor 和 UserInterceptor,用以对越权访问进行拦截(比如管理员访问用户页面,或者用户访问管理员界面啥的)。
AdminInterceptor
package Interceptors; import Models.UsersEntity; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class AdminInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { //从 Session 里获取当前登录的用户 UsersEntity user = (UsersEntity) httpServletRequest.getSession().getAttribute("user"); //判断当前用户的角色是否为非管理员 if(user.getUserRoleType() != 1) { //让他返回到正确的路径 httpServletResponse.sendRedirect("/"); return false; } //已登录 return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { } }
UserInterceptor
package Interceptors; import Models.UsersEntity; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class UserInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { //从 Session 里获取当前登录的用户 UsersEntity user = (UsersEntity) httpServletRequest.getSession().getAttribute("user"); //判断当前用户的角色是否为非用户 if(user.getUserRoleType() != 2) { //让他返回到正确的路径 httpServletResponse.sendRedirect("/"); return false; } //已登录 return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { } }
然后再在 dispatcher-servlet.xml 里注册一下新添加的拦截器,分别对指定的路径进行拦截。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <!-- 注册拦截器组 !--> <mvc:interceptors> <!-- 注册拦截器 !--> <mvc:interceptor> <!-- 拦截所有路径 !--> <mvc:mapping path="/**" /> <!-- 拦截器是哪个类的 !--> <bean class="Interceptors.LoginInterceptor" /> </mvc:interceptor> <mvc:interceptor> <!-- 拦截 /admin/ !--> <mvc:mapping path="/admin/**" /> <!-- 拦截器是哪个类的 !--> <bean class="Interceptors.AdminInterceptor" /> </mvc:interceptor> <mvc:interceptor> <!-- 拦截 /user/ !--> <mvc:mapping path="/user/**" /> <!-- 拦截器是哪个类的 !--> <bean class="Interceptors.UserInterceptor" /> </mvc:interceptor> </mvc:interceptors> <!-- 和下面的呼应,别把动态资源也给人家处理了 --> <mvc:annotation-driven /> <!-- 让框架自个儿找去吧 !--> <context:component-scan base-package="Controllers"></context:component-scan> <!-- 为了便于开发我们让 Tomcat 来处理静态资源,这样不用配 Nginx 啥的了 --> <mvc:default-servlet-handler/> </beans>
6、运行,测试。
管理员下 访问 /user ,就会被自动折返回 /admin。