1. 使用 Filter 完成一个简单的权限模型:

1). 需求:

①. 管理权限

> 查看某人的权限

> 修改某人的权限

②. 对访问进行权限控制: 有权限则可以访问, 否则提示: 没有对应的权限, 请 返回

2). 实现:

①. 对访问进行权限控制:

> 使用 Filter 进行权限的过滤: 检验用户是否有权限, 若有, 则直接响应目标页面; 若没有重定向到 403.jsp

 403.jsp

<body>
<h4>
没有对应的权限,
请 <a href="${pageContext.request.contextPath }/articles.jsp">返回</a>
</h4>
</body>

②. 使用 Filter 如何进行过滤:

- 获取 servletPath, 类似于 /app_3/article-1.jsp

- 在用户已经登录(可使用 用户是否登录 的过滤器)的情况下, 获取用户信息. session.getAttribute("user")

- 再获取用户所具有的权限的信息: List<Authority>

- 检验用户是否有请求 servletPath 的权限: 可以思考除了遍历以外, 有没有更好的实现方式

- 若有权限则: 响应

- 若没有权限: 重定向到 403.jsp

③.others:

- 用户若登录, 需要把用户信息(User 对象)放入到 HttpSession 中.

- 在检验权限之前, 需要判断用户是否已经登录.

3). 管理权限:

①. 封装权限信息: Authority
            Authority{
                    //显示到页面上的权限的名字

private String displayName;

//权限对应的 URL 地址: 已权限对应着一个 URL, 例如 Article_1 -> /app_4/article1.jsp

private String url;
           }

②. 封装用户信息: User

User{

private String username;

private List<Autority> authorities;
                 //...
            }

③创建一个 UserDao:

User get(String username);

void update(String username, List<Autority>);
4). 页面

authority-manager.jsp:

有一个 text 文本框, 供输入 username, 提交后, 使用 checkbox 显示当前用户所有的权限的信息.
5). Servlet

authority-manager.jsp 提交表单后 get 方法: 获取表单的请求参数: username,

再根据 username 获取 User 信息. 把 user 放入到request 中, 转发到 authority-manager.jsp.

authority-manager.jsp 修改权限的表单提交后 update 方法: 获取请求参数: username, authory(多选);

把选项封装为 List; 调用UserDao 的 update() 方法实现权限的修改; 重定向到 authority-manager.jsp

目录

权限管理部分代码实现

Authority.java

package com.aff.javaweb;

public class Authority {

    //显示到页面上的权限的名字
private String displayName; //权限对应的 URL 地址: 已权限对应着一个 URL, 例如 Article-1 -> /article-1.jsp
private String url; public String getDisplayName() {
return displayName;
} public void setDisplayName(String displayName) {
this.displayName = displayName;
} public String getUrl() {
return url;
} public void setUrl(String url) {
this.url = url;
} public Authority(String displayName, String url) {
super();
this.displayName = displayName;
this.url = url;
} public Authority() {
// TODO Auto-generated constructor stub
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((url == null) ? 0 : url.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Authority other = (Authority) obj;
if (url == null) {
if (other.url != null)
return false;
} else if (!url.equals(other.url))
return false;
return true;
} }

User.java

package com.aff.javaweb;

import java.util.List;

public class User {
private String username;
private List<Authority> authorities; public User() {
} public User(String username, List<Authority> authorities) {
super();
this.username = username;
this.authorities = authorities;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public List<Authority> getAuthorities() {
return authorities;
} public void setAuthorities(List<Authority> authorities) {
this.authorities = authorities;
} }

UserDao.java

package com.aff.javaweb;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class UserDao {
private static Map<String, User> users;
private static List<Authority> authorities = null;
static {
authorities = new ArrayList<>();
authorities.add(new Authority("Article-1", "/article-1.jsp"));
authorities.add(new Authority("Article-2", "/article-2.jsp"));
authorities.add(new Authority("Article-3", "/article-3.jsp"));
authorities.add(new Authority("Article-4", "/article-4.jsp")); users = new HashMap<String, User>();
User user1 = new User("AAA", authorities.subList(0, 2));
users.put("AAA", user1); user1 = new User("BBB", authorities.subList(2, 4));
users.put("BBB", user1);
} User get(String username) {
return users.get(username);
} void update(String username, List<Authority> authorities) {
users.get(username).setAuthorities(authorities);
} public List<Authority> getAuthorities() {
return authorities;
} public List<Authority> getAuthorities(String[] urls) {
List<Authority> authorities2 = new ArrayList<>();
for (Authority authority : authorities) {
if (urls != null) {
for (String url : urls) {
if (url.equals(authority.getUrl())) {
authorities2.add(authority); }
}
}
}
return
authorities2;
}
}

authority-manager.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<center>
<br><br>
<form action="AuthorityServlet?method=getAuthorities" method="post">
name:<input type="text" name="username" /> <input type="submit"
value="Submit" />
</form> <c:if test="${requestScope.user != null }">
<br><br> ${requestScope.user.username } 的权限是:
<br><br> <form action="AuthorityServlet?method=updateAuthority" method="post"> <input type="hidden" name="username" value="${requestScope.user.username }"> <c:forEach items="${authorities }" var="auth">
<c:set var="flag" value="false"></c:set>
<c:forEach items="${user.authorities }" var="ua">
<c:if test="${ua.url==auth.url }">
<c:set var="flag" value="true"></c:set>
</c:if> </c:forEach> <c:if test="${flag == true }">
<input type="checkbox" name="authority" value="${auth.url}" checked="checked"/>${auth.displayName }
</c:if>
<c:if test="${flag == false }">
<input type="checkbox" name="authority" value="${auth.url}" />${auth.displayName }
</c:if>

<br><br>
</c:forEach> <input type="submit" value="Update"/> </form> </c:if> </center>
</body>
</html>

AuthorityServlet.java

package com.aff.javaweb;

import java.io.IOException;
import java.lang.reflect.Method;
import java.util.List; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class AuthorityServlet extends HttpServlet {
private static final long serialVersionUID = 1L; public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String methodName = request.getParameter("method");
try {
Method method = getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
method.invoke(this
, request, response);
} catch (Exception e) {
e.printStackTrace();
}
} private UserDao userDao = new UserDao(); public void getAuthorities(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
User user = userDao.get(username); request.setAttribute("user", user);
request.setAttribute("authorities", userDao.getAuthorities());
request.getRequestDispatcher("/authority-manager.jsp"
).forward(request, response);
} public void updateAuthority(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String[] authorities = request.getParameterValues("authority");
List<Authority> authorityList = userDao.getAuthorities(authorities); userDao.update(username, authorityList);
response.sendRedirect(request.getContextPath() + "/authority-manager.jsp"
);
}
}

权限过滤代码实现

 article-1.jsp

<body>
Article 111
</body>

article-2.jsp

<body>
Article 222
</body>

article-3.jsp

<body>
Article 333
</

article-4.jsp

<body>
Article 444
</body>

articles.jsp

<body>
<a href="article-1.jsp">Article111 Page</a>
<br /><br /> <a href="article-2.jsp">Article222 Page</a>
<br /><br /> <a href="article-3.jsp">Article333 Page</a>
<br /><br /> <a href="article-4.jsp">Article444 Page</a>
<br /><br />

<a href="LoginServlet?method=logout">Logout...</a>

</body>

login.jsp

<body>
<form action="LoginServlet?method=login" method="post">
name: <input type="text" name="name" />
<input type="submit" value="Submit" />
</form>
</body>

logout.jsp

<body>
Bye! <br><br>
<a href="login.jsp">Login</a>
<%
session.invalidate();
%>
</body>

LoginServlet.java

package com.aff.javaweb;

import java.io.IOException;
import java.lang.reflect.Method; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
} protected void doPost(HttpServletRequest request, HttpServletResponse response) {
String methodName = request.getParameter("method");
try {
Method method = getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
method.invoke(this, request, response);
} catch (Exception e) {
e.printStackTrace();
}
} private UserDao userDao = new UserDao(); public void login(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 获取name
String name = request.getParameter("name");
// 调用UserDao 获取用户信息, 把用户信息放入到HttpSession中
User user = userDao.get(name);
request.getSession().setAttribute("user", user);
// 重定向到articles.jsp
response.sendRedirect(request.getContextPath() + "/articles.jsp");
}
public void logout(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 获取HttpSession
// 使HttpSession失效
request.getSession().invalidate(); // 重定向到 /login.jsp
response.sendRedirect(request.getContextPath() + "/login.jsp");
} }

AuthorityFilter.java

package com.aff.javaweb;

import java.io.IOException;
import java.util.Arrays;
import java.util.List; import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @WebFilter("*.jsp")
public class AuthorityFilter extends HttpFilter { @Override
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 获取 servletPath
String servletPath = request.getServletPath();
// 不需要拦截的url
List<String> uncheckedUrls = Arrays.asList("/403.jsp", "/articles.jsp", "/authority-manager.jsp", "/login.jsp",
"/logout.jsp");
if (uncheckedUrls.contains(servletPath)) {
chain.doFilter(request, response);
return;
} // 在用户已经登陆(可使用 用户是否登陆的 过滤器)的情况下, 获取用户信息, session.getAttribute("user")
User user = (User) request.getSession().getAttribute("user");
if (user == null) {
response.sendRedirect(request.getContextPath() + "/login.jsp");
return;
} // 再获取用户所具有的权限的信息:List<Authority>
List<Authority> authorities = user.getAuthorities(); // 检验用户是否请求servletPath 的权限: 可以思考除了遍历以外,有没有更好的实现方法
Authority authority = new Authority(null, servletPath);
// 若有权限则:响应
if (authorities.contains(authority)) {
chain.doFilter(request, response);
return;
} // 若没有权限: 重定向到403.jsp
response.sendRedirect(request.getContextPath() + "/403.jsp");
return;
} }

应用4:利用Filter限制用户浏览权限的更多相关文章

  1. 利用filter过虑用户请求URI显示对应页面内容

    目的:只是想验证一下filter对URI的过滤 流程讲解:浏览器请求URI,所有请求都走过虑器,在过滤器中处理符合某种请求的URI然后显示对应的页面内容 有2个JSP页面: index.jsp: &l ...

  2. 利用HTML5判断用户是否正在浏览页面技巧

    现在,HTML5里页面可见性接口就提供给了程序员一个方法,让他们使用visibilitychange页面事件来判断当前页面可见性的状态,并针对性的执行某些任务.同时还有新的document.hidde ...

  3. 利用Filter和拦截器,将用户信息动态传入Request方法

    前言: 在开发当中,经常会验证用户登录状态和获取用户信息.如果每次都手动调用用户信息查询接口,会非常的繁琐,而且代码冗余.为了提高开发效率,因此就有了今天这篇文章. 思路: 用户请求我们的方法会携带一 ...

  4. linux利用用户组给用户赋予不同的权限

    在Linux中wheel组就类似于一个管理员的组.通常在LUNIX下,即使我们有系统管理员root的权限,也不推荐用root用户登录.一般情况下用普通用户登录就可以了,在需要root权限执行一些操作时 ...

  5. 一则利用内核漏洞获取root权限的案例【转】

    转自:https://blog.csdn.net/u014089131/article/details/73933649 目录(?)[-] 漏洞描述 漏洞的影响范围 漏洞曝光时间 漏洞产生的原因 漏洞 ...

  6. JavaEE学习之Spring Security3.x——模拟数据库实现用户,权限,资源的管理

    一.引言 因项目需要最近研究了下Spring Security3.x,并模拟数据库实现用户,权限,资源的管理. 二.准备 1.了解一些Spring MVC相关知识: 2.了解一些AOP相关知识: 3. ...

  7. Linux用户和权限——用户和用户组管理

    Linux用户和权限——用户和用户组管理 摘要:本文主要介绍了Linux系统中的用户和用户组管理. 用户和用户组 含义 在使用Linux系统时,虽然输入的是自己的用户名和密码,但其实Linux并不认识 ...

  8. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理10

    今天把用户的菜单显示和页面的按钮显示都做好了,下面先来个效果图 接下来说下我实现的方法: 首先我在每个方法前面都加了这个属性, /// <summary> /// 表示当前Action请求 ...

  9. [.Net MVC] 用户角色权限管理_使用CLK.AspNet.Identity

    项目:后台管理平台 意义:一个完整的管理平台需要提供用户注册.登录等功能,以及认证和授权功能. 一.为何使用CLK.AspNet.Identity 首先简要说明所采取的权限控制方式.这里采用了基于角色 ...

随机推荐

  1. 获取Wi-Fi的SSID

    前几天做项目的时候,碰到一个问题,获取wifi的SSID,其实就是获取Wi-Fi的名字 iOS12以前 在iOS13之前获取wifi的SSID很简单,苹果提供了接口CNCopyCurrentNetwo ...

  2. 集训模拟赛-1-T1

    最近学校网课跟得紧没时间写知识点,就拿题解凑个数(bushi 而且前两天我打着打着题解电脑就突然死机 幸运的是 我没有保存(微笑) 废话不多说 上题目! 城市攻击 (city) (256MB,1s) ...

  3. POJ2376Cleaning Shifts(区间覆盖贪心)

    应该还是蛮简单的一题,但是因为模拟太差,一直没调出来....... \(显而易见的应该按照左区间从小到大排序,相等按照右区间大到小排序\). \(那么第一个区间的l一定要是1,而且必拿(否则没有区间能 ...

  4. Python 爬取豆瓣电影Top250排行榜,爬虫初试

    from bs4 import BeautifulSoup import openpyxl import re import urllib.request import urllib.error # ...

  5. spring学习笔记(九)事务学习(上)

    前述 ​ 这段时间在工作中碰到一个事务相关的问题.先说下这个问题的场景,我们是一个商城项目,正在开发优惠券模块,现在有一个需求是需要批量领取优惠券,而且在领券时,其中一张领取失败不能影响其他符合要求的 ...

  6. 【FreeRTOS学习05】深度解剖FreeRTOSConfig.h实现对系统的自定义剪裁

    ROM/RAM太小,因此要对系统进行剪裁: 相关文章 [FreeRTOS实战汇总]小白博主的RTOS学习实战快速进阶之路(持续更新) 文章目录 相关文章 1 系统的剪裁 2 FreeRTOSConfi ...

  7. DP动态规划之01背包问题

    目录 问题描述 问题分析 问题求解 Java代码实现 优化方向一:时间方面:因为是j是整数是跳跃式的,可以选择性的填表. 思考二:处理j(背包容量),w(重量)不为整数的时候,因为j不为整数了,它就没 ...

  8. Python 简明教程 --- 1,搭建Python 环境

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 人生苦短,我用Python. -- 龟叔T恤 Python 是一门解释型语言,所以要想运行Pytho ...

  9. android 百度地图v3.2.0获取实际地址

    百度地图升级到v3.2.0后,api发生挺大的变化的,但是下载的Demo却不是最新版本的. 在v3.2.0之前获取详细地址只要:option.setIsNeedAddress(true); 但是升级后 ...

  10. python中copy与deepcopy的区别

    目录 区别 python代码举例 区别 高级语言中变量是对内存及其地址的抽象 copy.copy(object), 拷贝的是内嵌套结构的地址引用,当前到结构发生变化的时候,浅拷贝也相应的改变. cop ...