2020.04.29大战Filter过滤器
管理员权限过滤器代码如下:
package cn.edu.lingnan.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebFilter("/admin/*")
public class AuthorityFilter implements Filter {
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
//1拿到用户的权限,登录的时候
HttpServletRequest req =(HttpServletRequest) arg0;
HttpServletResponse resp =(HttpServletResponse) arg1;
HttpSession s = req.getSession();
Integer superuser=(Integer) s.getAttribute("superuser");
System.out.println("AuthorityFilter superuser's values : "+superuser);
//2根据拿到的权限进行相应的处理,没登录、管理员、普通用户、null、1,、2
if(superuser!=null) {
if(superuser==1 || superuser==0)
arg2.doFilter(arg0, arg1);
else
resp.sendRedirect(req.getContextPath()+"/authority.html");
}else {
resp.sendRedirect(req.getContextPath()+"/index.html");
}
}
}
1.写完AuthorityFilter类和admin.html之后,运行整个项目,一直出现这种情况:
输入账号密码后一直这样,后来觉得配置文件web.xml有问题,就:
原来漏了个filter,推理稍后。
后来改正后,登录,跳转admin.html时出现:
空白,仔细想,原来是这个:
Project下的build aut…啥的没有勾上,这东西叫重构。
到这了,这是一个关于注销的技术难点,
在谈这个之前先说说权限控制的问题,我们希望的不是一登录就控制,而是控制一部分的网页资源,起码ok.html能随便看的,不用登陆直接访问
http://localhost:8080/JavaWeb2018764344/ok.html,
因此我们在WebContent下面设置一个文件夹,夹里面的html才是我们要限制的,WebContent下的html可直接访问。
回归正题,一路登录到我们要限制的页面在,由于这个页面还没有设置注销,因此我们回退到ok.html,注销后回到登录页面,原本管理员登录信息已经没了,但此刻再次访问
http://localhost:8080/JavaWeb2018764344/admin/admin.html
还能跳转到限制的管理员页面(只要在再次跳转后的页面刷新即可回到登录页面),这不是我们期望的,原因是啥呢,上图倒数第二行,注销后
没有System.out.println("AuthorityFilter superuser's values : "+superuser);
这是AuthorityFilter类的东西,没有输出权限意味着没读到,因为在该类中读到就一定会输出,说明我们读到的是缓存里的东西,因此我们要在admin.html页面中强制刷新即可,无论你读的是内存还是啥,只要跳到这个页面,就会刷新退回登录页面(当然这仅限于注销管理员账户后),admin.html中强制刷新代码如下:
<body οnlοad="opener.Location.reload()">
最后,关于在管理员才能访问的页面
注销时出现:
仔细看路径,我们是在admin.html界面中点的注销,相比正常的注销:
多了一个admin,这是因为我们在admin文件夹下点的注销,
人家ok.html是在WebContent下点的注销,当然找不到,因此我们要再多设一个路径,
/代表WebContent,第一个是WebContent下的html,由于WebContent下还有admin个文件夹,故写成如二。
路径领悟:核心:/ 代表某个文件夹下的直接文件
JavaWeb项目中的路径的第一个/代表JavaWeb2018764344这个文件夹下的直接文件如ok.html,/文件夹xx/文件xx 代表JavaWeb2018764344文件夹下的文件夹xx文件夹的文件xx,因此,在某个文件夹的某个文件中点某个链接必会带上这个文件夹名的。包以文件夹方式存储。