如果用户没有登录直接访问的话
所有要求全部转到登录页面登录才可访问
以此实现了初步的安全管理
之前去口试也是被问到了这个问题
ps:讲真,现在真的有好多安全控件儿,用这个的还能有多少
好吧,作为根本,毕竟笔者也是新人一枚
话说回来,讲到之前口试被问到这个问题
也便是,在登录成功之后,那么后续的
比如一些只有leader才能利用的管理页面怎么去拦截呢
总不能你登录之后,从某些渠道得到了内页的登录地址
然后直接输入地址就可以访问内页了?
当然是不可能的
本日更新:小白篇:关于内页访问的权限校验
当然还是利用Filter....毕竟别的笔者是真的不会啊,哈哈哈哈
上代码:以之前的登录拦截为根本
SSM框架利用Filter实现页面不上岸拦截,禁止跳过登录逼迫访问
今日代码:
public class UrlFilter implements Filter{@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// TODO Auto-generated method stub}@Overridepublic 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) {//获取sessionHttpSession 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对应的权限地址并查询//根据权限地址查询权限idSystem.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在用户权限凑集中返回truereturn true;}}}//2.2、 如果不在权限中,返回falsereturn false; }@Overridepublic 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对应的权限地址并查询//根据权限地址查询权限idSystem.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在用户权限凑集中返回truereturn true;}}}//2.2、 如果不在权限中,返回falsereturn false; }
开始的时候本来是想要去校验权限的id,但是后来创造其实用substring去截取其实更大略一点(字符串真的操作真的很主要)平时要常看看
还有一点:filter中是不能利用Autowired的,如果须要利用注入的话,可以如下
ServletContext context = request.getServletContext(); ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context); SessionService sessionService = ctx.getBean(SessionService.class);
还记得这个把,刚开始打仗spring的时候
通过been.xml去过去,怎么说呢,手动配置加载这样
用框架多了,很多以前的根本都忘了
根本实在才是最主要的,框架千万种,万变不离其宗
只要根本稳定,什么框架都不在话下
可是假如你只会框架,恐怕到时候真的碰着问题就真的老大难咯
末了:关于权限还有部分没有实现——关于部分用户拥有只读权限,部分用户拥有全部操作权限这部分,个人想法是在权限表中在多加一个字段,验证的时候去验证详细 只读/操作,不知道大家有没有什么更好的办法,欢迎评论区谈论留言哈