之前写了关于SSM框架中利用Filter不登陆拦截访问
如果用户没有登录直接访问的话
所有请求全部转到登录页面登录才可访问
以此实现了初步的安全管理
之前去面试也是被问到了这个问题
ps:讲真,现在真的有好多安全控件儿,用这个的还能有多少
好吧,作为基础,毕竟笔者也是新人一枚
话说回来,讲到之前面试被问到这个问题
也就是,在登录成功之后,那么后续的
比如一些只有leader才能使用的管理页面怎么去拦截呢
总不能你登录之后,从某些渠道得到了内页的登录地址
然后直接输入地址就可以访问内页了?
当然是不可能的
今天更新:小白篇:关于内页访问的权限校验
当然还是使用Filter....毕竟别的笔者是真的不会啊,哈哈哈哈
上代码:以之前的登录拦截为基础
SSM框架利用Filter实现页面不登陆拦截,禁止跳过登录强制访问
今日代码:
public class UrlFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO 对全栈url进行过滤
//将request和response对象强转为http类型
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
//获取访问的地址
String url = req.getRequestURI();
//允许所有人访问的地址,全部定义到数组中
String[] urls={"tologin.do","login.do","error.do","logout.do","top.do","left.do","right.do"};
//用来判断用户当前访问地址是否在不登陆可访问的权限内
boolean contains=true;
for(String u:urls){
//url的截取7:因为我的uri根中是 “/dscms/” 共七个字符,根据个人情况,如果没有,不用截取
if(url.substring(7).equals(u)){
contains=false;
}
}
//获取session中的对象判断是否登录
//拦截所有的 .do 请求但不包含tologin.do
//jsp文件已经封装到webinf下 不用过滤 之过滤 .do请求即可
if(url.contains(".do")&contains) {
//获取session
HttpSession session = req.getSession();
TUser user=(TUser) session.getAttribute("USER");
if(user==null){//如果用户为空,说明没有登录,返回到登录页面
resp.sendRedirect("/dscms/tologin.do");
chain.doFilter(req, resp);
}else {//用户不为空,说明用户登录了,访问网址的时候验证权限
//验证权限,如果当前访问地址没有在用户权限范围内提示地址错误
if(chkPermission(req)){
//继续执行过滤连的剩余部分
chain.doFilter(req, resp);
}else {
//没有权限访问,返回错误代码或者自己定义的错误页面
resp.sendError(404);
//resp.sendRedirect("../error.do");
chain.doFilter(req, resp);
}
}
}
chain.doFilter(req, resp);
}
//判断当前地址权限是否在用户权限范围内
private boolean chkPermission(HttpServletRequest request){
//1、获取用户当前访问的uri
String uri=request.getRequestURI().substring(7);
//1.1 判断当前uri访问需要的权限id
//截取当前uri对应的权限地址并查询
//根据权限地址查询权限id
System.out.println(uri);
//获取permission实例:filter中是无法自动注入的,因为这样生成两个该filter的实例A和B(A:tomcat之类的容器管理,B为spring管理)
//2、获取当前用户的权限集合
TUser user=(TUser)request.getSession().getAttribute("USER");
List<TPermission> permissions = user.getPermissions();
//遍历用户当前权限列表,判断权限
for(TPermission pers:permissions) {
if(pers.getUrl()!=null&&!"".equals(pers.getUrl())){
if (pers.getUrl().equals(uri)) {
//2.1 、判断,如果当前uri的id在用户权限集合中返回true
return true;
}
}
}
//2.2、 如果不在权限中,返回false
return false;
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
之前的文章上面也发出来了
今天用的还是以之前的Filter类作为基础
在用户登录之后,继续加了一层验证
也就是在判断用户已经登录之后
if(user==null){//如果用户为空,说明没有登录,返回到登录页面
resp.sendRedirect("/dscms/tologin.do");
chain.doFilter(req, resp);
}else {//用户不为空,说明用户登录了,访问网址的时候验证权限
//验证权限,如果当前访问地址没有在用户权限范围内提示地址错误
if(chkPermission(req)){
//继续执行过滤连的剩余部分
chain.doFilter(req, resp);
}else {
//没有权限访问,返回错误代码或者自己定义的错误页面
resp.sendError(404);
//resp.sendRedirect("../error.do");
chain.doFilter(req, resp);
}
}
也就是这里继续校验
下面封装了一个chkPermission()方法
如果写在一起实在显得臃肿
//判断当前地址权限是否在用户权限范围内
private boolean chkPermission(HttpServletRequest request){
//1、获取用户当前访问的uri
String uri=request.getRequestURI().substring(7);
//1.1 判断当前uri访问需要的权限id
//截取当前uri对应的权限地址并查询
//根据权限地址查询权限id
System.out.println(uri);
//获取permission实例:filter中是无法自动注入的,因为这样生成两个该filter的实例A和B(A:tomcat之类的容器管理,B为spring管理)
//2、获取当前用户的权限集合
TUser user=(TUser)request.getSession().getAttribute("USER");
List<TPermission> permissions = user.getPermissions();
//遍历用户当前权限列表,判断权限
for(TPermission pers:permissions) {
if(pers.getUrl()!=null&&!"".equals(pers.getUrl())){
if (pers.getUrl().equals(uri)) {
//2.1 、判断,如果当前uri的id在用户权限集合中返回true
return true;
}
}
}
//2.2、 如果不在权限中,返回false
return false;
}
开始的时候本来是想要去校验权限的id,但是后来发现其实用substring去截取着实更简单一点(字符串真的操作真的很重要)平时要常看看
还有一点:filter中是不能使用Autowired的,如果需要使用注入的话,可以如下
ServletContext context = request.getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
SessionService sessionService = ctx.getBean(SessionService.class);
还记得这个把,刚开始接触spring的时候
通过been.xml去过去,怎么说呢,手动配置加载这样
用框架多了,很多以前的基础都忘了
基础其实才是最重要的,框架千万种,万变不离其宗
只要基础牢固,什么框架都不在话下
可是要是你只会框架,恐怕到时候真的遇到问题就真的老大难咯
最后:关于权限还有部分没有实现——关于部分用户拥有只读权限,部分用户拥有全部操作权限这部分,个人想法是在权限表中在多加一个字段,验证的时候去验证具体 只读/操作,不知道大家有没有什么更好的办法,欢迎评论区讨论留言哈