Session过滤器

来源:互联网 发布:数据冗余类型 编辑:程序博客网 时间:2024/04/16 12:56

我们经常会碰到这样的情况,当我们有事情离开了一会,等再回来继续我们在网页中的操作时,会出现session超时的错误,然后跟上一堆的错误,让用户感觉很不爽,像这种情况如果能在一个错误页面给个Session超时的提示就会比较友好些,再一种情况,当一个系统中的用户角色有多个,有些页面对于一些级别低的用户来说是没有权限观看的,可能在页面上能根据不同的权限屏蔽了一些链接让低级别的用户无法进入,但是这只能让低级别的用户看不见高级操作的链接,假如用户知道链接的地址直接在地址栏中输入链接,岂不是也可以进入系统啊,要解决这两个问题就得在页面中做判断了。

If(session == null) {

       //如果是超时则跳转到登陆页面重新登陆

}

If(checkAuthority() == false) {

       //如果权限不足则跳转到错误页面给个提示

}

解决此类问题目前我了解有2种方法:

第一种解决方法:在每个JSP页面上,通过session对象取到绑定的值进行判断。若取到的值为null,则通过JS返回到登录界面。代码如下:
<%
   //当session失效后进行的判断:给予提示并让管理员重新登录
   if(session.getAttribute("userid") == null) {
    out.println("<script             type='text/javascript'>parent.window.location=/Logon.jsp</script>");
   }
%>
此解决方法的优点:技术实现简单,考虑问题少。
缺点:代码重用多,每个页面都需要添加此段代码,麻烦,烦琐。

第二种解决方法:我们使用了过滤器来解决了这个问题。

border=0 v:shapes="_x0000_i1025">

新建一个过滤器命名为:FilterDemo,该类继承自:javax.servlet.Filter

public class FilterDemo implements Filter{

 

    public void destroy() {}

 

    public void doFilter(ServletRequest sreq, ServletResponse response,

           FilterChain filterChain)

 throws IOException, ServletException {

       HttpServletRequest request=(HttpServletRequest)sreq;

       HttpSession session = request.getSession(false);

       if(session == null) {

           //如果是session超时,在此处做处理

       }

      

       if(request.getRequestURI().endsWith("download.do")) {

           //此处可以针对不同的请求根据用户是否具有权限来做处理

       }

       request.getRequestDispatcher("/Error.jsp").

forward(request,response);

    }

 

    public void init(FilterConfig filterConfig)

throws ServletException {}

}

然后将新建的Filter添加到web.xml中,部署Filter需要添加两部分:

1.filter元素

filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、servlet或servlet-mapping元素之前。

<filter>

       <filter-name>SessionFilter</filter-name>

       <filter-class>myPackage.FilterDemo</filter-class>

</filter>

2.filter-mapping元素

filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前

<filter-mapping>

       <filter-name>SessionFilter</filter-name>

       <url-pattern>*.do</url-pattern>

</filter-mapping>

以上内容表示所以的请求中以.do结尾的都有首先通过我们这里指定的过滤器:

 

新建一个Servlet来测试:

public class DownLoadDemo extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

     public DownLoadDemo() {

        super();

    }

 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

       this.doPost(request, response);

    }

 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

       request.getRequestDispatcher("/DownLoadExcel.jsp").

forward(request, response);

    }

 

}

在web.xml中部署好该servlet

<servlet>

       <servlet-name>DownLoadDemo</servlet-name>

       <servlet-class>com.sinosoft.base.sessiondemo.DownLoadDemo</servlet-class>

    </servlet>

   

    <servlet-mapping>

       <servlet-name>DownLoadDemo</servlet-name>

       <url-pattern>/download</url-pattern>

    </servlet-mapping>

新建jsp来测试

Index.jsp
<body>

    <form action="download.do">

    <h1>This is a Demo Application</h1>

    <a href = 'DownLoadExcel.jsp'>导出Excel</a>

    <input type='submit'>

    </form>

</body>

为了便于对比我们使用了一个是超链接的形式,一个是通过servlet来跳转,当点击提交按钮时会被拦截,而直接点击超链接就不会被拦截,因为我们的Filter中配置的是拦截.do形式的,如果要拦截jsp也可以使用<url-pattern>DownLoadExcel.jsp</url-pattern>

再添加一个错误页面Error.jsp

<body>

<h1>对不起,你没有权限</h1>

</body>


参考文档:http://www.cnblogs.com/gmq/archive/2009/07/16/1524733.html

      http://blog.sina.com.cn/s/blog_69b38dde0100ksgf.html

原创粉丝点击