今天下午,临下课的时候有个学生问了个关于过滤器的使用的问题,也不知道她从搞想到的,估计也是网上哪位达人的演示,她说原来那个功能有些局限,自己扩张了一下,但老是达不到效果。于是就来找我了。
她的需求如下:
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这些内部转发都会被过滤。^_^
总结:通过上面过滤器的小例子,相信你也看出了,我们可以做一个基于角色的权限管理系统,不同角色的人可以使用不同的网站功能,这也算我没今天没白折腾这几小时吧,总得留下点什么吧。唉,做技术真难啊!
分享到:
相关推荐
本教程将详细讲解如何使用Java Web中的过滤器(Filter)来实现这样的访问控制。过滤器是Servlet API的一部分,它允许我们在请求到达目标资源(如Servlet、JSP页面)之前或之后对请求和响应进行拦截处理。 首先,...
`Filter`过滤器是Java Servlet技术中的一种机制,用于对HTTP请求和响应进行预处理和后处理,从而实现诸如权限验证、数据转换、日志记录等功能。在这个场景中,我们将探讨如何使用`Filter`来实现权限访问控制,以及...
综上所述,Java Filter是实现用户浏览权限限制的关键工具。它允许我们在请求到达实际处理资源的Servlet之前进行干预,执行必要的身份验证和授权检查。通过对Filter的熟练运用,开发者可以构建出更加安全、可控的Web...
在Java Web开发中,购物车、字符过滤器和权限过滤器是重要的组成部分,它们共同构建了一个安全、功能完善的用户交互系统。以下是对这些概念的详细解释: 1. **购物车**: 购物车是电商网站的核心功能之一,它允许...
- **独立性较高**:拦截器并不依赖于Servlet容器,因此可以在任何环境中使用拦截器技术来实现类似的功能。 - **适用范围广**:除了传统的Web应用外,拦截器还可以应用于各种基于Java的框架或库中。 - **过滤器**...
1. **用户认证**:在Struts中,可以使用过滤器(如Jaas登录过滤器)或自定义Action来处理用户的登录请求。认证过程包括获取用户名和密码,验证它们与数据库中的记录是否匹配。一旦验证成功,将用户信息保存在Session...
【标题】"一个简单的基于jsp的在线考试系统"所涉及的知识点主要集中在Java Web开发领域,特别是使用JSP(JavaServer Pages)技术构建一个在线考试平台。JSP是一种动态网页技术,它允许开发者将Java代码嵌入到HTML或...
在Java Web开发中,过滤器(Filter)是实现动态网页应用程序功能的重要组件之一。它能够对HTTP请求和响应进行预处理和后处理,为实现特定的功能提供了强大的支持。本话题将详细探讨如何利用Filter来限制用户浏览特定...
在Java Web开发中,`web.xml`过滤器是一个不可或缺的部分,它为开发者提供了强大的功能,帮助他们实现对Servlet和JSP页面的预处理和后处理。过滤器在服务器上先于目标Servlet或JSP页面执行,能够拦截、修改请求和...
标题中的“day17过滤器 禁止缓存中文乱码自动登录MD5加密url级别权限控制”涉及了多个IT领域的知识点,我们将逐一详细解释。 1. **过滤器(Filter)**: 过滤器是Java Web开发中的一种机制,它允许我们在请求到达...
3. 访问地址过滤:通过过滤器可以限制用户访问特定的URL,例如只有具备特定权限的用户才能访问管理页面。 4. 网站logo过滤:可以通过过滤器动态地为网站中的所有页面添加logo,而不必在每个页面上重复代码。 在扩展...
可以使用Filter进行权限过滤,限制未授权访问。 4. **个人信息管理**:允许用户查看和更新自己的信息,如修改密码、完善个人资料等。 **JSP与Servlet协同工作** 1. **JSP作为视图层**:负责展示数据,通常结合CSS和...
过滤器可以实现的功能包括: 1. **数据转换**:比如,将请求参数从一种格式转换为另一种格式。 2. **安全控制**:检查请求是否包含敏感信息,或者限制非法访问。 3. **字符编码**:统一设置请求和响应的编码格式,...
总之,Java Web开发中的过滤器是一种强大的工具,它提供了灵活的扩展性和可复用性,能够帮助开发者实现多种功能,提升应用程序的安全性、性能和用户体验。在实际项目中,合理利用过滤器可以极大地提高代码的组织结构...
一个请求可以经过多个过滤器,每个过滤器都可以有自己的处理逻辑,这使得过滤器可以灵活地组合使用,实现复杂的功能。 10. **Spring框架中的Filter**: Spring框架也提供了`FilterRegistrationBean`,方便在...
4. **权限控制**:通过Servlet检查用户权限,如管理员操作、普通用户权限限制等。 5. **搜索功能**:使用Servlet处理查询请求,模型层执行SQL查询,视图展示搜索结果。 四、JSP+Servlet实现步骤 1. **创建数据库...
Servlet过滤器大全,各种详细使用的代码! 一、字符编码的过滤器 二、使浏览器不缓存页面的过滤器 三、检测用户是否登陆的过滤器 四、资源保护过滤器 五 利用Filter限制用户浏览权限
在Java Web开发中,FCKeditor是一款非常流行的富文本编辑器,它允许用户在网页上进行格式化的文本编辑,包括插入图片、链接等操作。在JSP环境下配置FCKeditor并实现图片上传功能,需要一系列步骤。下面我们将详细...