3 回答

TA貢獻10條經驗 獲得超2個贊
回復 想要飛的更高:RBAC ? 基于角色的權限控制
??tb_user
??tb_role
??tb_userrole
??tb_menu(增、刪、改、查)
??tb_rolemenu
1 說明
我們給出三個頁面:index.jsp、user.jsp、admin.jsp。
??index.jsp:誰都可以訪問,沒有限制;
??user.jsp:只有登錄用戶才能訪問;
??admin.jsp:只有管理員才能訪問。
2 分析
設計User類:username、password、grade,其中grade表示用戶等級,1表示普通用戶,2表示管理員用戶。
當用戶登錄成功后,把user保存到session中。
創建LoginFilter,它有兩種過濾方式:
??如果訪問的是user.jsp,查看session中是否存在user;
??如果訪問的是admin.jsp,查看session中是否存在user,并且user的grade等于2。
3 代碼
User.java
public class User {
?private String username;
?private String password;
?private int grade;
…
}
為了方便,這里就不使用數據庫了,所以我們需要在UserService中創建一個Map,用來保存所有用戶。Map中的key中用戶名,value為User對象。
UserService.java
public class UserService {
?private static Map<String,User> users = new HashMap<String,User>();
?static {
??users.put("zhangSan", new User("zhangSan", "123", 1));
??users.put("liSi", new User("liSi", "123", 2));
?}
?
?public User login(String username, String password) {
??User user = users.get(username);
??if(user == null) return null;
??return user.getPassword().equals(password) ? user : null;
?}
}
login.jsp
? <body>
? <h1>登錄</h1>
? ?<p style="font-weight: 900; color: red">${msg }</p>
??? <form action="<c:url value='/LoginServlet'/>" method="post">
??? ?用戶名:<input type="text" name="username"/><br/>
??? ?密 碼:<input type="password" name="password"/><br/>
??? ?<input type="submit" value="登錄"/>
??? </form>
? </body>
index.jsp
? <body>
??? <h1>主頁</h1>
??? <h3>${user.username }</h3>
??? <hr/>
??? <a href="<c:url value='/login.jsp'/>">登錄</a><br/>
??? <a href="<c:url value='/user/user.jsp'/>">用戶頁面</a><br/>
??? <a href="<c:url value='/admin/admin.jsp'/>">管理員頁面</a>
? </body>
/user/user.jsp
<body>
<h1>用戶頁面</h1>
<h3>${user.username }</h3>
<hr/>
</body>
/admin/admin.jsp
<body>
? <h1>管理員頁面</h1>
? <h3>${user.username }</h3>
? <hr/>
</body>
LoginServlet
public class LoginServlet extends HttpServlet {
?public void doPost(HttpServletRequest request, HttpServletResponse response)
???throws ServletException, IOException {
??request.setCharacterEncoding("utf-8");
??response.setContentType("text/html;charset=utf-8");
??
??String username = request.getParameter("username");
??String password = request.getParameter("password");
??UserService userService = new UserService();
??User user = userService.login(username, password);
??if(user == null) {
???request.setAttribute("msg", "用戶名或密碼錯誤");
???request.getRequestDispatcher("/login.jsp").forward(request, response);
??} else {
???request.getSession().setAttribute("user", user);
???request.getRequestDispatcher("/index.jsp").forward(request, response);
??}
?}
}
LoginUserFilter.java
? <filter>
??? <display-name>LoginUserFilter</display-name>
??? <filter-name>LoginUserFilter</filter-name>
??? <filter-class>cn.itcast.filter.LoginUserFilter</filter-class>
? </filter>
? <filter-mapping>
??? <filter-name>LoginUserFilter</filter-name>
??? <url-pattern>/user/*</url-pattern>
? </filter-mapping>
public class LoginUserFilter implements Filter {
?public void destroy() {}
?public void init(FilterConfig fConfig) throws ServletException {}
?public void doFilter(ServletRequest request, ServletResponse response,
???FilterChain chain) throws IOException, ServletException {
??response.setContentType("text/html;charset=utf-8");
??HttpServletRequest req = (HttpServletRequest) request;
??User user = (User) req.getSession().getAttribute("user");
??if(user == null) {
???response.getWriter().print("您還沒有登錄");
???return;
??}
??chain.doFilter(request, response);
?}
}
LoginAdminFilter.java
? <filter>
??? <display-name>LoginAdminFilter</display-name>
??? <filter-name>LoginAdminFilter</filter-name>
??? <filter-class>cn.itcast.filter.LoginAdminFilter</filter-class>
? </filter>
? <filter-mapping>
??? <filter-name>LoginAdminFilter</filter-name>
??? <url-pattern>/admin/*</url-pattern>
? </filter-mapping>
public class LoginAdminFilter implements Filter {
?public void destroy() {}
?public void init(FilterConfig fConfig) throws ServletException {}
?public void doFilter(ServletRequest request, ServletResponse response,
???FilterChain chain) throws IOException, ServletException {
??response.setContentType("text/html;charset=utf-8");
??HttpServletRequest req = (HttpServletRequest) request;
??User user = (User) req.getSession().getAttribute("user");
??if(user == null) {
???response.getWriter().print("您還沒有登錄!");
???return;
??}
??if(user.getGrade() < 2) {
???response.getWriter().print("您的等級不夠!");
???return;
??}
??chain.doFilter(request, response);
?}
}
添加回答
舉報