
在JavaWeb应用程序中,许多Jsp页面需要特定的用户权限才能浏览,例如,用户需要登录才能访问某些homework.jsp,但是如何不执行任何拦截操作,用户可以直接在URL中输入***: *** / homework.jsp的浏览器获取jsp页面资源,这是不允许的.
对于这种情况,一种简单而粗略的方法是在这种jsp类型的开头添加Java脚本代码以检查会话. 这可能会生效,但是代码的可重用性太差,逻辑功能相同,如果有100个这样的jsp页面,则必须被写入100次jsp实现登录验证,这不容易维护. 本文介绍如何使用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的上下文对象. 通过此pageContext对象获取HttpSession和HttpServletResponse,对会话进行逻辑以确定用户是否已登录,然后使用响应进行重定向.

请注意,此处最关键的步骤是结果分配. 如果result的值为SKIP_BODY,则该方法返回jsp之后,服务器将跳过标签开头和结尾的所有部分. 这一步非常重要,因为在许多情况下,jsp页面将使用诸如javabeans之类的操作. 这些bean的分配仅对登录用户有效. 对于未登录的用户,如果未跳过这些操作jsp实现登录验证,则服务器可能会报告“在范围内找不到bean”和其他类似错误,因此必须在此处正确分配结果. 用户登录后,将结果分配给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时,将直接跳至“登录”页面,请求用户登录.
注意: J2EE标记类TagSupport具有许多其他用途. 本文仅是一个实验示例. 有关详细信息,请参阅Java API
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-187866-1.html
亦是示威