Jsp中使用过滤器实现用户权限限制功能
今天下午,临下课的时候有个学生问了个关于过滤器的使用的问题,也不知道她从搞想到的,估计也是网上哪位达人的演示,她说原来那个功能有些局限,自己扩张了一下,但老是达不到效果。于是就来找我了。
她的需求如下:
1、目标:限制登录用户的访问页面,根据不同的权限可以查询相应的页面。
2、场景:已有三个用户admin、normal1、normal2,其中normal1只能访问page/jsp1下的页面,normal2只能访问page/jsp2下的页面;
根据她的描述,我打开她的代码一看,一个字“乱”,两个字“很乱”,完全看不到任何逻辑在里面,于是凭着经验大刀阔斧的给它来个修正,修正代码如下:
if (session.getAttribute("user") != null) { if(((UserInfo)session.getAttribute("user")).getName().equals("normal1") && !uri.startsWith("/page/jsp1")){ request.getRequestDispatcher("/page/jsp1/normal1.jsp").forward(request, response); } if(((UserInfo)session.getAttribute("user")).getName().equals("normal2") && !uri.startsWith("/page/jsp2")){ request.getRequestDispatcher("/MyJsp.jsp").forward(request, response);} }else{ if(!(uri.endsWith("result.jsp") || !uri.endsWith("index.jsp"))){ request.getRequestDispatcher("/MyJsp.jsp").forward(request, response);} }
其中:user变量是她定义session里的值,保存了登录进来的用户的信息;uri为获取到的客户端说请求的页面的地址。
经过这样修改之后基本的逻辑功能就有了,即除了管理员登录其他人都要各自进各自“家”。但是事情完全没有就这样结束,我以为就这样就完事了呢,谁知道人家一运行说不行,随便登录一个用户什么都能看到,一个也没有限制。靠,这可把我打击了一把,心想老子也干了好几年,难道还有问题,于是乎我钻到她的机器上去了。
接着就是按套路出牌,打断点,启动调试,运行......运行了几遍,果然和她说的一样,什么人都能进,另外就是死都不进断点(晚上回家后终于进断点了,汗...)。另外学生用的MyEclipse,调试起来老是进到另外一个web站点的filter的断点,郁闷的我没脾气了。(说来奇怪,这个班一共八组人,其它七组都在用eclipsed的JEE版的那个东东,就他们组在用MyEclipse,这都全拜他们组长领导有方啊,其实我也不是说用MyEclipse不好,但他们用的那个版本也太老土了,现在新版的Eclipse功能比他强多了,人家喜欢用,咱也不能强迫啊,都是为人民服务的,人民愿意,那咱还能咋的呢)
后来没脾气了,发到我自己机器上调了一下,偶然的机会看了下她的登录操作的处理,我傻眼了,她是这么写的:
String name = request.getParameter("name"); String password = request.getParameter("password"); if (name.equals("") || password.equals("")) { response.sendRedirect("/MyJsp.jsp"); } else { UserInfo user = new UserInfo(); user.setName(name); user.setPassword(password); session.setAttribute("user", user); response.sendRedirect("page/admin.jsp"); }
我靠,大家看仔细了啊,这段代码的意思只要输入了用户名和密码,那么你就能登录进来,好这个还不明显的话,那么请您再结合上面的过滤器一起来看,这就是说,除了normal1和normal2,其他所有的人都当作管理员来处理了,终于找到症结了,心情豁然开朗,是在登录这个地方出了纰漏。一般我们做权限显示,所谓限制是限制指定的用户,对与不限制的那就是BOSS,所以在登录这个地方又加了判断,满足上面的三个用户的要求,防止出现一堆的BOSS,修改后如下:
String name = request.getParameter("name"); String password = request.getParameter("password"); if (name.equals("") || password.equals("")) { response.sendRedirect("/MyJsp.jsp"); } else { if (name.equals("normal1") || name.equals("normal2") || name.equals("admin")) { UserInfo user = new UserInfo(); user.setName(name); user.setPassword(password); session.setAttribute("user", user); response.sendRedirect("page/admin.jsp"); } else { response.sendRedirect("MyJsp.jsp"); } }
这样就相当于对登录用户做了限制,不是什么人都能登录的,是吧,让你登你才能登。
另外还有一点需要注意的是,使用过滤器的时候默认的配置,在使用
request.getRequestDispatcher("/MyJsp.jsp").forward(request, response);
时是不会重新进入过滤器的,若此时也希望过滤器起作用则需要在这么配置web.xml文件
<filter> <display-name>FilterStation</display-name> <filter-name>FilterStation</filter-name> <filter-class>com.FilterStation</filter-class> </filter> <filter-mapping> <filter-name>FilterStation</filter-name> <url-pattern>/page/*</url-pattern> <dispatcher>ERROR</dispatcher> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping>
这样当发生类似forward和include这些内部转发都会被过滤。^_^
总结:通过上面过滤器的小例子,相信你也看出了,我们可以做一个基于角色的权限管理系统,不同角色的人可以使用不同的网站功能,这也算我没今天没白折腾这几小时吧,总得留下点什么吧。唉,做技术真难啊!
阅读更多- 使用jsp过滤器实现登录权限
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- 过滤器和拦截器的比较及未登录用户权限限制的实现(ZHUAN)
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- c#实现按用户角色分配菜单的使用权限(WinForm)
- Jsp开发中使用Cookie实例(实现记住密码功能)
- 【JSP】Cookie的使用及保存中文,并用Cookie实现购物车功能
- 使用AspNetPager分页控件、分页存储过程及用户控件基类实现的完美分页功能
- ASP.NET jQuery 食谱11 (通过使用jQuery validation插件简单实现用户登录页面验证功能)
- 使用product_user_profile来实现用户权限的设定
- 对jsp的一个小结(8)使用servlet控制新闻管理、使用过滤器(解决乱码)和监听器(统计在线用户人数)
- 使用Servlet过滤器实现用户登录验证
- JSP模式2 实现用户注册的功能