
jun - 云代码空间
—— 相信 ,梦
package cn.itcast.web.filter;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.domain.User;
//权限过滤器
public class PrivilegeFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
// 1.将请求与响应对象强制转换成http协议下的
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
response.setContentType("text/html;charset=utf-8");
// 2.完成操作--通过user的role来判断当前资源是否可以访问(url极另的权限控制)
// 2.1 得到访问的资源路径,判断它是否需要权限控制
String uri = request.getRequestURI();
String contextpath = request.getContextPath();
String path = uri.substring(contextpath.length());
// 这些路径是需要权限控制的
if (adminRole.contains(path)||userRole.contains(path)) {
// 2.2 得到当前登录用户
User user = (User) request.getSession().getAttribute("user");
if (user != null) {
// 登录
// 2.3得到当前用户的role
String role = user.getRole();
if ("admin".equals(role)) {
if (adminRole.contains(path)) {
// 说明当前要访问的资源,当前admin角色可以访问
chain.doFilter(request, response);
return;
} else {
throw new RuntimeException("权限不足");
}
} else {
// 这是user角色
if (userRole.contains(path)) {
chain.doFilter(request, response);
return;
} else {
throw new RuntimeException("权限不足");
}
}
} else {
// 没有登录
response.getWriter().write(
"请<a href='" + request.getContextPath()
+ "/demo1/login.jsp'>登录</a>");
return;
}
} else {
chain.doFilter(request, response);
return;
}
// 3.放行
// chain.doFilter(request, response);
}
private List<String> adminRole = new ArrayList<String>();
private List<String> userRole = new ArrayList<String>();
public void init(FilterConfig config) throws ServletException {
// 获取admin.txt,user.txt文件的绝对磁盘路径
String adminPath = config.getServletContext().getRealPath(
"/WEB-INF/admin.txt");
String userPath = config.getServletContext().getRealPath(
"/WEB-INF/user.txt");
fillList(adminPath, adminRole);
fillList(userPath, userRole);
}
// 将path代表的路径下的文件内容存储到指定的集合中
private void fillList(String path, List<String> list) {
try {
BufferedReader br = new BufferedReader(new FileReader(path));
String line = null;
while ((line = br.readLine()) != null) {
list.add(line);
}
br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
<!-- url级别的权限控制 --> <filter> <filter-name>privilege</filter-name> <filter-class>cn.itcast.web.filter.PrivilegeFilter</filter-class> </filter> <filter-mapping> <filter-name>privilege</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>