`
流年已逝_奋斗不止2013
  • 浏览: 1987 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

J2ee标签类实现用户登录验证和页面跳转

    博客分类:
  • 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

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics