`

使用过滤器来处理Session超时和权限管理

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

If(session == null) {
       //如果是超时则跳转到登陆页面重新登陆
}

If(checkAuthority() == false) {
       //如果权限不足则跳转到错误页面给个提示
}

每个.jsp页面中加上以上的判断貌似能够解决问题,然而一个系统往往有成百上千的jsp页面,倘若每个页面都这样加岂不是很费事,而且如果将来的权限判断发生变化,将要维护所有的jsp这样的工作量是很大的,灵活性很差,要是在进入这些jsp之前必须统一经过一个地方,在这个地方来做判断貌似要好一下,我们使用了过滤器来解决了这个问题



 

新建一个过滤器命名为: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>

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    sh4springmvc3层架构html5+jsp多视图

    这个demo实现了简单地用户管理,权限管理,角色管理,底层使用ssh4的dao,service...利用过滤器实现session超时管理,权限管理需要自己补全。echache实现了二级缓存,打印sql可以看到部分配置后不会重复查询数据库。

    Asp.net 中mvc 实现超时弹窗后跳转功能

    假设过期时间为30分钟,校验发生在服务器,借助过滤器,可以这样写 public class PowerFilter : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { var cookie ...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    3.4.1 Session、Application和Cache 3.4.2 Request 3.4.3 Response 3.4.4 Server 3.4.5 User 3.4.6 Trace 3.4.7 访问其他类中的HTTP上下文 3.5 总结 第4章 服务器控件 4.1 服务器控件的类型 ...

    Spring Security 中文教程.pdf

    7.4. 使用其他过滤器 —— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor 8.2. ExceptionTranslationFilter 8.2.1. AuthenticationEntryPoint 8.2.2. AccessDeniedHandler 8.3. ...

    SpringSecurity 3.0.1.RELEASE.CHM

    7.4. 使用其他过滤器 —— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor 8.2. ExceptionTranslationFilter 8.2.1. AuthenticationEntryPoint 8.2.2. AccessDeniedHandler 8.3. ...

    Spring Security-3.0.1中文官方文档(翻译版)

    7.4. 使用其他过滤器—— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor 8.2. ExceptionTranslationFilter 8.2.1. AuthenticationEntryPoint 8.2.2. AccessDeniedHandler 8.3. ...

    ASP.NET4高级程序设计(第4版) 3/3

    3.4.1 Session、Application和Cache 84 3.4.2 Request 85 3.4.3 Response 86 3.4.4 Server 88 3.4.5 User 90 3.4.6 Trace 91 3.4.7 访问其他类中的HTTP上下文 96 3.5 总结 96 第4章 服务器控件 ...

    springboot-ng:springboot+angular -- 17年5月停更

    7.session超时处理和httpsession监听器 8.bootstarp-Admin框架 9.记录登录者信息,存储在mongodb中.(使用到百度地图api中的IP精确定位) 已包含工具类: 1.ID生成器 2.日期处理 3.短信验证码发送(使用的是云片网络) ...

    spring security 参考手册中文版

    13.5与其他基于过滤器的框架一起使用 118 13.6高级命名空间配置 118 14.核心安全筛选器 119 14.1 FilterSecurityInterceptor 119 14.2 ExceptionTranslationFilter 121 14.2.1 AuthenticationEntryPoint 122 14.2.2 ...

    J2EE中关于web.xml文件的配置

    通过 web.xml 文件,我们可以对 Web 应用进行配置,例如设置应用程序的名称、描述、过滤器、监听器、Servlet、会话超时等等。 以下是 web.xml 文件中的一些常用元素: 1. `&lt;web-app&gt;`:web.xml 文件的根元素,用于...

    JAVA上百实例源码以及开源项目源代码

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    JAVA上百实例源码以及开源项目

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    java开源包8

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    多多校园论坛,很经典很强大

    4 管理员登录 管理留言 时,第一次输入错误时返回后,必再按一下“管理留言”来刷新页面,否则验证码不对,后台管理使用session记录在线状态,超时请重新登录 5 权限等级: 管理员 前后台所有操作,但不作为发贴者...

    java开源包1

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java开源包11

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java开源包2

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java开源包3

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

Global site tag (gtag.js) - Google Analytics