在JavaWeb应用中,很多Jsp页面需要特定的用户权限才能浏览,比如需要用户登陆后才能访问某个homework.jsp,而如何不做任何拦截操作,用户可以在浏览器的URL中直接输入***:***/homework.jsp从而获得jsp页面资源,这是不能被允许的。
针对这种情况,一种简单粗暴的方法就是在这类jsp的开头加入java脚本代码,对session进行检查。这样做可以生效,但代码复用性太差,同样功能的逻辑,如果有100个这样的jsp页面,就要写100遍,不便于维护。本文介绍如何使用java标签来实现jsp页面的请求拦截和用户验证。
java中的标签类使用方法我就不详细介绍了,一般的普通标签逻辑,比如输出提示信息,简单的数据运算,这些操作使用SimpleTagSupport就可以实现了。但是对于类似于登陆验证这类在标签处理后需要返回处理jsp页面的逻辑,SimpleTagSupport就无法满足了,需要使用TagSupport。
首先,新建一个CheckSessionHandler继承TagSupport。
import java.io.IOException; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport; public class CheckSessionHandler extends TagSupport { /** * */ private static final long serialVersionUID = 1L; @Override public int doStartTag() throws JspException { int result=0; HttpSession session=pageContext.getSession(); String loginInfo=(String)session.getAttribute("LoginInfo"); if(loginInfo==null){ result=SKIP_BODY; try { HttpServletResponse response=(HttpServletResponse)pageContext.getResponse(); response.sendRedirect("/HomeworkWeb/"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else{ result=EVAL_BODY_INCLUDE; } return result; } }
上面一段代码中,doStartTag方法,是服务器遇到标签开始项时就执行的方法,pageContext是TagSupport的实例变量,这个pageContext是调用该标签的jsp的上下文对象,可以被Handler继承直接使用,通过这个pageContext对象获取HttpSession和HttpServletResponse,对session做逻辑判断用户是否登陆过,然后使用response进行重定向。
注意,这里最关键的一步在于result的赋值,如果result的值为SKIP_BODY,则方法返回jsp之后,服务器将跳过标签开始和标签结束部分的全部部分。这一步很重要,因为很多情况下jsp页面会使用javabean等操作,这些bean的赋值可能必须在对已登陆用户才有效,对于未登录用户,如果不跳过这些操作,服务器可能会报cannot find bean in scope等类似的错误,因此这里必须对result进行正确赋值。当用户已经登陆的情况下,result被赋值为EVAL_BODY_INCLUDE,则服务器将继续执行标签体重的内容。
第二步,在WebContent/WEB-INF/tlds/MyTag.tld中添加该标签
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.2</tlib-version> <jsp-version>2.0</jsp-version> <short-name>MyTag</short-name> <tag> <name>checkSession</name> <tag-class>edu.nju.homework.tag.CheckSessionHandler</tag-class> </tag> </taglib>
第三步,在jsp页面中使用标签。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="MyTag" uri="/WEB-INF/tlds/MyTag.tld" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>我的作业列表</title> </head> <MyTag:checkSession> <h1 style="position:relative;left:140px">您的作业列表</h1> <jsp:useBean id="homeworkList" type="edu.nju.homework.bean.HomeworkList" scope="session"></jsp:useBean> <jsp:useBean id="homework" class="edu.nju.homework.bean.Homework" scope="page"></jsp:useBean> <TABLE width="60%" border="0" cellpadding="0" cellspacing="1"> <tbody> <tr> <th>课程名称</th> <th>作业情况</th> </tr> <% for(int i=0;i<homeworkList.size();i++){ pageContext.setAttribute("homework",homeworkList.getHomework(i)); %> <tr> <td align="center"><jsp:getProperty name="homework" property="courseName"></jsp:getProperty></td> <td align="center"><jsp:getProperty name="homework" property="state"></jsp:getProperty></td> </tr> <% } %> </tbody> </TABLE> </MyTag:checkSession> </html>
以上步骤完成后,启动服务器,当用户未登陆且在浏览器中直接输入jsp页面的URL时,将直接跳转到Login页面要求用户登录。
注:J2EE标签类TagSupport有其他多种用法,本文只是实验性的例子,详情请查询Java API
相关推荐
- **ActionForward**:定义了Action处理完请求后页面跳转的行为。 - **Taglib**:自定义的JSP标签库,简化了JSP页面的编写。 ##### 1.2 对象关系映射工具Hibernate Hibernate是一个开源的ORM框架,用于简化Java...
2. 用户登录验证的业务逻辑实现。 3. Struts2的配置文件和结果类型。 4. Java环境下的Web开发,尤其是J2EE标准的应用。 5. 拦截器的概念及其在验证过程中的作用。 通过对这些知识点的理解和实践,开发者能够掌握...
- **2.4.2 ActionForward类**:ActionForward类用于定义Action执行后页面跳转的行为。 - **2.4.3 ActionMapping类**:ActionMapping类用于映射ActionServlet、ActionForm和Action之间的关系。 - **2.5 Struts模型...
5. **JDBC和数据库交互**:博客系统必然涉及到数据存储,通过JDBC(Java Database Connectivity)可以连接和操作数据库,如MySQL,实现用户的注册、登录、文章发布等功能。 6. **Hibernate ORM**:尽管标签没有明确...
### J2EE电子商务系统开发从入门到精通——基于Struts和Hibernate技术实现 #### J2EE概论 **1.1 简单双层架构到复杂多层架构** - **1.1.1 双层(C/S)软件架构设计** - 双层架构(客户端/服务器架构,Client/...
- 实现员工的登录验证功能。 - **4.2.2 人事信息管理** - 管理员工的人事档案,包括个人信息、工资福利等。 - **4.2.3 新闻发布中心** - 发布公司内部新闻、公告等信息。 - **4.2.4 资产信息管理** - 管理公司的...
Action验证用户输入,如果登录成功,则跳转到success.jsp,否则返回登录页面显示错误信息。 通过学习和实践"j2ee struts 框架初级"的"firststruts2"项目,开发者能够掌握Struts2的基础架构,理解如何构建Action、...
从创建Action类,配置`struts-config.xml`,编写ActionForm,设计JSP页面,到利用拦截器和标签库,逐步搭建一个完整的Struts应用程序。这将帮助你提升在J2EE项目中的实际开发能力,更好地应对企业级开发挑战。
### J2EE电子商务系统开发从入门到精通:基于Struts和Hibernate技术实现 #### J2EE概论 - **双层架构与多层架构的区别**: - 双层架构通常指的是客户端/服务器(Client/Server, C/S)架构,这种架构下的应用程序在...
1. 用户登录与权限管理:Struts1.2的Action类负责接收和处理用户请求,包括登录验证。系统可以设置不同角色的权限,例如,学生只能参加考试,而管理员则能添加试题和管理考试。 2. 考试创建与管理:利用Struts1.2的...
因此,在具体设计实现该博客网站时,主要考虑了主流博客网站的几个主要功能:(1)博客的注册、登录验证功能(2) 网络用户通过关键字搜索博文功能(3) 最热门博客页面推荐浏览(4) 文章详细内容及相关评论显示(5) 博客...
Struts的配置文件(如struts.xml)用于定义控制器的逻辑流程,使得页面间的跳转和流程控制更加清晰明了,便于理解和维护。此外,Struts支持将业务逻辑封装在Action类中,这些类扮演控制器的角色,负责处理用户请求,...
Struts2有集成Spring Security或Apache Shiro等安全框架的能力,可以实现登录验证、角色权限控制等功能,确保用户访问的安全性。 **5. 页面跳转与视图渲染** 在`bookstore`应用中,Struts2的Result类型(例如:...
- **转发:** Servlet之间的转发可以在服务器端实现页面跳转,而无需重新发送HTTP请求。 - **重定向:** 重定向是指将当前请求转交给另一个资源处理,客户端浏览器会收到一个新的URL并重新发起请求。 #### 五、...
在系统页面设计上,除了基本的登录界面和功能页面,还需要考虑用户体验,使界面简洁、实用且美观。例如,学生登录后应跳转至选课页面(xuanke.jsp),选课成功后显示在success.jsp,教师则能进行课程管理操作。 实验...
3. **导航和页面跳转**:通过Ajax实现无刷新的页面跳转,提高用户体验。 4. **实时通信**:结合WebSocket,J2EE可以为Ajax提供双向通信,实现实时数据推送,如股票行情、聊天室等功能。 5. **进度条显示**:在文件...
Struts 就是这样一种基于 Servlets 2.2 和 JSP 1.1 标签(符合 J2EE 规范)的 MVC 实现。即便你从未使用 Struts 构建系统,通过研究 Struts 也能为你的未来 Servlet 和 JSP 实现带来不少启示。 #### Model-View-...