在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
本文介绍了一种在JavaWeb应用中实现JSP页面权限控制的方法,通过自定义Java标签检查用户的登录状态,避免未授权访问。
622

被折叠的 条评论
为什么被折叠?



