JavaWeb用户使用Ajax请求Session超时解决方法

1.测试过程中修改web.xml中的超时时间单位分钟,便于测试;

2.配置过滤器

3.session超时有两种情况;

一种是普通请求,即发起请求返回视图和模型;另外一种是Ajax请求,主要返回模型数据。后端进行处理时就要根据不同的请求返回不同的内容。

对于普通请求,我们直接返回JavaScript脚本,脚本内容可以是将页面跳转到登录页面。

   对于Ajax请求,则需要返回非200的状态码,这样ajax请求才会进入到error回调函数中以及全局的Ajax错误回调函数AjaxError中。

4.后端拦截器在preHandle()中处理session超时

public class ParamsInterceptor extends HandlerInterceptorAdapter {
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object o) throws Exception {
        Map paramsMap = request.getParameterMap();
        for (Iterator<Map.Entry> it = paramsMap.entrySet().iterator(); it.hasNext(); ) {
            Map.Entry entry = it.next();
            Object[] values = (Object[]) entry.getValue();
            for (Object obj : values) {
                String oldStr = obj.toString();
                String newStr = StringUtil.StringFilter(oldStr);
                if (!oldStr.equals(newStr)) {
                    throw new ParamsUncheckException();
                }
            }
        }
        BossUser bossUser = (BossUser) request.getSession().getAttribute("user");
        String uri = request.getRequestURI();
        if (bossUser == null) {
            response.setContentType("text/html;charset=UTF-8");
            if (request.getHeader("x-requested-with") != null
                    && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
                // Ajax请求, 前端根据此header进行处理
                response.setHeader("sessionTimeout", "Session time out, you need relogin !");
                // 返回未认证的状态码(401)
                response.setStatus(HttpStatus.UNAUTHORIZED.value());
                //System.out.println("请求路径:" + uri + ", 请求方式 :Ajax请求, Session超时, 需要重新登录!");
            }
        }
        return super.preHandle(request, response, o);
}

    public void postHandle(HttpServletRequest hsr, HttpServletResponse hsr1,
                           Object o, ModelAndView mav) throws Exception {
    }

    public void afterCompletion(HttpServletRequest hsr,
                                HttpServletResponse hsr1, Object o, Exception excptn)
            throws Exception {
    }
}

通过获取Session中的User对象是否存在来判断Session是否超时,如果Session超时,则根据不同的请求方式进行返回。如果是普通请求,则直接返回JavaScript脚本,该脚本可以将页面跳转到其它URL。如果是Ajax请求,则返回401状态码,并且在返回的header中加入sessionTimeout,该数据将会在前端使用。
5.在使用ajax请求的前端页面处理拦截器发来的数据

对于普通请求,后端返回的是JavaScript脚本,会立刻执行,这里前端不需要任何处理。

对于Ajax请求,后端返回401状态码,并在header中设置的sessionTimeout。这里使用jQuery的ajaxComplete回调函数处理,具体如下:

测试可以正常拦截处理,大功告成!

在此感谢以下两位博主的分享,特附链接;

https://blog.csdn.net/u012383839/article/details/53727008

https://www.cnblogs.com/jpfss/p/9487235.html

注:如有问题可以回复,看到第一时间分析解决,码农不易,感觉对您有用,帮助到您,可否打赏一杯可乐,在此谢过诸位,愿诸君终成大神,前程似锦~~~

 

Ajax请求session超时处理流程 java服务器端处理: SessionValidateFilter中修改: if (ServerInfo.isAjax(request)) { request.setAttribute("statusCode", 301); request.setAttribute("message", "Session timeout!"); response.sendRedirect(response.encodeRedirectURL("/ajaxDone.jsp"); else { response.sendRedirect(response.encodeRedirectURL(this.loginUrl + java.net.URLEncoder.encode(backToUrl, "UTF-8"))); } ajaxDone.jsp页面 <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> { statusCode:${statusCode}, message:"${message}", objectId:"${objectId}" } js客户端处理: ajax load页面碎片处理: 自己写一个loadUrl()方法,不能使用jquery自带的load(). 当客户端调用loadUrl()超时,弹出一个登录框,并加一个背景层下面的整个浏览器.这时浏览器窗口内容不能变,只是上面加了一个登录框和一个背景层 当用户输入username and password登录成功后,去掉登录框和背景层.这时用户可以继续操作. 登录失败alert出错信息,浏览器窗口内容还是不变. var DWZ = { loginUrl:"/render.do?method=login", ajaxDoneEval:function (json) { //session timeout try{ return eval('(' + json + ')'); } catch (e){ return {}; } } }; (function($){ $.extend({ loadUrl: function(url,data,callback){ var aData = data || {}; aData["timestamp"] = new Date().getTime(); var $this = $(this); $.get(url, aData, function(data){ var json = DWZ.ajaxDoneEval(data); if (json.statusCode==301){ alertMsg.error(json.message, {okCall:function(){ window.location = "/render.do?method=login"; //popLoginWin(); }}); } else { $this.html(data).initUI(); if (jQuery.isFunction(callback)) callback(); } }); } }); })(jQuery); ajax post 表单数据处理: 当客户端ajax提交表单超时, 弹出一个登录框,并加一个背景层下面的整个浏览器. 当用户输入username and password登录成功后,去掉登录框和背景层.这时用户可以继续操作. 登录失败alert出错信息. $.post(form.action, params, callback(json){ if (json.statusCode == 301) { //301 状态表示 session timeout popLoginWin(); }else if (json.statusCode == 300) { //300 状态表示 操作失败 alertMsg.error(json.message); } else if(json.statusCode == 200) { //300 状态表示 操作成功 alertMsg.correct(json.message); } }, "json");
JavaWeb 中,可以使用 Cookie 来跟踪用户Session 信息。 首先,在服务器端创建一个 Session 对象,可以使用以下代码: ```java HttpSession session = request.getSession(true); ``` 这个方法会检查请求中是否包含了一个 Session ID,如果没有,就会创建一个新的 Session 对象,并返回一个包含 Session ID 的 Cookie。如果已经存在 Session ID,就会返回对应的 Session 对象。 接下来,我们可以将需要保存的数据存储在 Session 对象中: ```java session.setAttribute("username", "John"); ``` 这里将一个名为 username 的属性设置为 John。 最后,将 Session ID 返回给客户端,可以使用以下代码: ```java Cookie cookie = new Cookie("sessionId", session.getId()); response.addCookie(cookie); ``` 这里创建一个名为 sessionId 的 Cookie,并将 Session ID 设置为其值,最后将 Cookie 添加到响应中。 当客户端发送请求时,服务器会读取 Cookie 中的 Session ID,然后从服务器的 Session 中获取对应的数据。可以使用以下代码来读取 Session 中的数据: ```java HttpSession session = request.getSession(false); String username = (String) session.getAttribute("username"); ``` 这里将获取名为 username 的属性的值,如果 Session 不存在,就返回 null。 注意,将敏感数据保存在 Cookie 中是不安全的,因为 Cookie 可以被窃取或篡改。因此,建议对敏感数据进行加密或使用其他更安全的方式进行保存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值