web应用常用session处理(防session过大,内存占用过大)

来源:互联网 发布:wow3.3.5数据库 编辑:程序博客网 时间:2024/06/05 05:40

鉴于本人已入职大型公司,部分代码比较优秀,所以剽窃之,做下记录,以免浪费。


虽然在tomcat里面就可以配置session过期时间,但是比较少去这样做。如下是用代码方式,自己完成一个session管理。

代码出自实际项目:


首先,在web.xml里面配置过滤器,专门用于管理session:

<filter>
<filter-name>sessionmanager</filter-name>
<filter-class>com
.xx.common.SessionTimoutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sessionmanager</filter-name>
<url-pattern>*.htm</url-pattern>
</filter-mapping>

这个过滤器拦截一切.htm结尾的url


然后就是过滤器SessionTimeOutFileter的代码:

过滤器方法doFilter代码如下:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
dofilter((HttpServletRequest) request, (HttpServletResponse) response, chain);
chain.doFilter(request, response);
}


public void dofilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
//判断是否超过规定时间没有访问
long SESSION_TIMEOUT = SysCache.SESSION_TIMEOUT;
if (SESSION_TIMEOUT >= 1L) {
HttpSession session = request.getSession();
//当前时间
long crrentTime = System.currentTimeMillis();
//上次访问时间
Object obj = session.getAttribute("lastAccesTime");
long lastAccesTime = (obj == null ? crrentTime : ((Long) obj).longValue());


if (crrentTime - lastAccesTime <= SESSION_TIMEOUT) {
if (!"1".equals(request.getParameter("nosession"))) {
// nosession 参数用在定时刷新请求上,不记录上次访问时间
session.setAttribute("lastAccesTime", crrentTime);
}
} else {
session.invalidate();
if (log.isInfoEnabled()) {
log.info(request.getServletPath() + "--" + request.getQueryString() + " session timeout [" + (crrentTime - lastAccesTime) + "] ms!");
}
//resp.sendRedirect(req.getContextPath()+"/login.jsp");
}
}
}

SysCache.SESSION_TIMEOUT是配置的一个long常量,定义session多长时间不访问则过期。


这样,就实现了sessin在规定时间内不访问,则过期并删除的代码。从而防止内存中session过大的问题。


0 0
原创粉丝点击