在我们做实际项目当中,经常会对部分页面的访问进行控制。例如在一个交友系统中,假设有一个页面是listFriends.jsp,当然用户要访问这个页面就必需要行进行登陆,如果是一个匿名用户(没登陆的用户)访问,那么系统的开发者就应当考虑对这个页面需不需要做一个访问的控制,以限定访问用户的类型。一般来说对于这样的样面都是需要做访问控制。一来可以避免操作出错,二来可以防止信息的泄漏。
对具体一个页面,做访问控制可以有两种方法实现。一种是通过session,另一种通过Filter。假设一个用户登陆之后,开发者在session当中存储一个变量id,也就用是用户编号,这个编号是唯一的,可以在这个会话被销毁之前都有效,那么访问控制的语句如下:
if(session.getAttribute("id") ==null)
{
response.sendRedirect(path);//path是处理的页面的路径
}
当用户访问这个页面时,就会执行上面的语句,如果用户没有登陆那么就会自动跳转预先设定的处理页面。
上面的办法只能够实现对一个页面的访问控制,如果是需要对多个页面进行访问控制,那么上面的方法就不可取。我们可以通过Filter来实现。
首先,创建一个类MyFilter,这个类必须实现Filter这个接口,而且覆盖Filter接口定义的三个方法,具体代码如下,假设代码index.jsp页面是要进行控制访问的页面,处理页面是index_1.jsp,读者可以自己创建这两个页面,另外可以在doFilter()方法里加上自己的控制条件语句。
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
public class PatManagerFilter implements Filter{
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)arg0;
HttpServletResponse res = (HttpServletResponse)arg1;
String path = req.getServletPath();//获取访问路径
for(int i = path.length() - 1; i >= 0; i --)//获取访问的页面
if(path.charAt(i) != '/')
page = path.charAt(i) + page;
if("index.jsp".equals(page))//如果访问的是index.jsp页面,那么跳转到index_1.jsp
{
res.sendRedirect("index_1.jsp");
}
arg2.doFilter(req, res);//执行原路径
}
public void init(FilterConfig arg0) throws ServletException {
System.out.println("Init Filter");
}
}
然后,在web.xml当中加上下面的代码:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>MyFilter</filter-class><!--类所在的路径-->
</filter>
<filter-mapping>
<filter-name>myFilter
</filter-name>
<url-pattern>/*.jsp</url-patter>
</filter-mapping>
到些所需要做的工作结束,读者可以自行补充其它代码,然后测试。
通过在web.xml当中配置Filter,开发可以最大限度减少冗余代码,可以对多个页面进行访问控制。