J2ee标签类实现用户登录验证和页面跳转
在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
上一篇: HTML&CSS基础学习笔记1.3-HTML的标签语法
下一篇: tkinter使用标签