filter和sessionListener实现session超时退出功能,过滤掉轮询请求
1.requestFilter
public class RequestFilter implements Filter {
HashSet<String> set = new HashSet();
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req =(HttpServletRequest) request;
HttpSession session = req.getSession();
String head = req.getHeader("sessionTimeOut");
if (head == null) {
long lastPostTime = System.currentTimeMillis();
System.out.println("ID1:" + session.getId());
session.setAttribute("lastPostTime", lastPostTime);
}
chain.doFilter(req, response);
}
@Override
public void destroy() {
}
}
2.sessionListener
@Override
public void sessionCreated(HttpSessionEvent event) {
HttpSession session = event.getSession();
int time = 1;
session.setMaxInactiveInterval(time * 60);
session.setAttribute("sysTimeout",session.getMaxInactiveInterval());
System.out.println(time);
}
public class SessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent event) {
HttpSession session = event.getSession();
int time = 1;
session.setMaxInactiveInterval(time * 60);
session.setAttribute("sysTimeout",session.getMaxInactiveInterval());
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
}
}
3.web.xml
<!--listener-->
<listener>
<listener-class>com.kuang.core.SessionListener</listener-class>
</listener>
<!-- filter的映射 -->
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.kuang.core.RequestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>
4.loginOut接口
@RequestMapping("/sessionLoginOut")
@ResponseBody
public String sessionLoginOut(HttpServletRequest request){
HttpSession session = request.getSession();
long lastPostTime = (long) session.getAttribute("lastPostTime");
long currentTime = System.currentTimeMillis();
Object sysTimeout = session.getAttribute("sysTimeout");
long sysTime = Long.valueOf(String.valueOf(sysTimeout));
System.out.println("sys:" + sysTime);
System.out.println("差:" + (currentTime - lastPostTime)/1000);
if ((currentTime - lastPostTime)/1000 >= sysTime) {
return "1000";
}
return "100000";
}
5.前端Ajax轮询
var sessionTimeout = setInterval("sessionLoginOut()", 1000);
function sessionLoginOut() {
$.ajax({
url: '/sessionLoginOut',
async:false,
beforeSend: function (XMLHttpRequest) {
XMLHttpRequest.setRequestHeader("sessionTimeOut", "timeout");
},
type: 'post',
success: function (data) {
if (data === "1000") {
window.location.href = "/login";
clearInterval(sessionTimeout);
}else {
console.log(data);
}
}
})
}