Javaweb项目中关于session超时的问题解决
这篇文章主要介绍了Javaweb项目session超时解决方案,关于解决方案分类比较明确,内容详细,需要的朋友可以参考下。
在Java Web开发中,Session为我们提供了很多方便,Session是由浏览器和服务器之间维护的。Session超时理解为:浏览器和服务器之间创建了一个Session,由于客户端长时间(休眠时间)没有与服务器交互,服务器将此Session销毁,客户端再一次与服务器交互时之前的Session就不存在了。
0.需求
需要对所有的/web/**请求进行登录拦截,Session超时时跳转到登录页面。
1.引入
一般来说,在项目使用中都会配置Session超时时间,如果不配置,则默认值为30分钟,即用户不操作30分钟以后,Session就会失效,此时用户就需要重新登录系统。
Session超时时间的配置主要的项目的web.xml中进行配置,如下:
<span style="font-size: 14px;"> <!-- 设置Session超时时间 --> <session-config> <!-- 分钟 --> <session-timeout>60</session-timeout> <!-- 去除URL上显示的jsessionid, 防止打开Tab页时出现JS错误 --> <tracking-mode>COOKIE</tracking-mode> </session-config></span><span style="font-size:24px;"> </span>
2.请求的分类
现在的项目中请求主要分为两种:一种是普通请求,即发起请求返回视图和模型;另外一种是Ajax请求,主要返回模型数据。后端进行处理时就要根据不同的请求返回不同的内容。
对于普通请求,我们直接返回JavaScript脚本,脚本内容可以是将页面跳转到登录页面。
对于Ajax请求,则需要返回非200的状态码,这样ajax请求才会进入到error回调函数中以及全局的Ajax错误回调函数AjaxError中。
3.后端处理Session超时
后端采用SpringMVC的拦截器处理,这里为什么用拦截器呢?一方面,请求URL不能限制的太死,比如/*,这样对所有的请求都进行过滤是浪费资源的。另一方面,有些URL不需要进行拦截处理,比如到登录页面的请求肯定是不能拦截,要不然会循环重定向。再一方面,我们只需要拦截控制器请求,其它请求不拦截。
下面看一下拦截器的实现:
/** * Web端登录拦截器 * 处理请求时Session失效的问题,包含Ajax请求和普通请求 * @ClassName WebLoginInterceptor * @author zhangshun * @date 2016年10月20日 上午11:14:52 */ public class WebLoginInterceptor extends HandlerInterceptorAdapter{ /** * 日志对象 */ private Logger logger = LoggerFactory.getLogger(WebLoginInterceptor.class); /** * 默认注销URL * 即Session超时后,发起请求到此地址,只对普通请求有效 */ private static final String DEFAULT_LOGOUT_URL = "/web/logout"; /** * 注销URL */ private String logoutUrl; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { User user = SessionUtils.getUserFromRequestAcrossCas(request); String uri = request.getRequestURI(); if(user == 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()); logger.debug("请求路径:" + uri + ", 请求方式 :Ajax请求, Session超时, 需要重新登录!"); }else{ // 普通请求 String path = request.getContextPath(); StringBuffer basePath = new StringBuffer() .append(request.getScheme()) .append("://") .append(request.getServerName()) .append(":") .append(request.getServerPort()) .append(path) .append("/"); StringBuffer responseStr = new StringBuffer() .append("<html><header><script type=\"text/javascript\">") .append("window.location.href=\"") .append(basePath).append(getLogoutUrl()).append("\";") .append("</script></header></html>"); response.getWriter().write(responseStr.toString()); logger.debug("请求路径:" + uri + ",请求方式 :普通请求, Session超时, 需要重新登录!"); } return false; } return true; } public String getLogoutUrl() { // 使用默认值 if(StringUtils.isEmpty(logoutUrl)){ return DEFAULT_LOGOUT_URL; } return logoutUrl; } public void setLogoutUrl(String logoutUrl) { this }
通过获取Session中的User对象是否存在来判断Session是否超时,如果Session超时,则根据不同的请求方式进行返回。如果是普通请求,则直接返回JavaScript脚本,该脚本可以将页面跳转到其它URL。如果是Ajax请求,则返回401状态码,并且在返回的header中加入sessionTimeout,该数据将会在前端使用。
该拦截器在SpringMVC配置文件中的配置如下:
<span style="font-size:14px;"><!-- MVC拦截器 --> <mvc:interceptors> <!-- Web登录拦截器 --> <mvc:interceptor> <mvc:mapping path="/web/**"/> <mvc:exclude-mapping path="/web/index"/><!-- 防止循环重定向到首页 --> <mvc:exclude-mapping path="/web/login"/> <mvc:exclude-mapping path="/web/logout"/> <mvc:exclude-mapping path="/web/doLogin"/> <bean class="com.woyi.mhub.interceptor.WebLoginInterceptor"/> </mvc:interceptor> </mvc:interceptors></span><span style="font-size:24px;"> </span>
4.前端处理Session超时
对于普通请求,后端返回的是JavaScript脚本,会立刻执行,这里前端不需要任何处理。
对于Ajax请求,后端返回401状态码,并在header中设置的sessionTimeout。这里使用jQuery的ajaxComplete回调函数处理,具体如下:
// 实现ajax请求时判断Session是否失效 $(document).ajaxComplete(function(event, response, settings) { var sessionTimeout = response.getResponseHeader("SessionTimeout"); if(sessionTimeout != null && typeof sessionTimeout != "undefined" && sessionTimeout.length > 0){ // 这里写Session超时后的处理方法 } });
好了,可以了,Session超时的用户都会得到处理。
总结
Atas ialah kandungan terperinci Javaweb项目中关于session超时的问题解决. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Kegagalan sesi biasanya disebabkan oleh tamat tempoh seumur hidup sesi atau penutupan pelayan. Penyelesaian: 1. Memanjangkan hayat sesi; 2. Gunakan storan berterusan;

Penyelesaian kepada masalah silang domain PHPSession Dalam pembangunan pemisahan front-end dan back-end, permintaan merentas domain telah menjadi kebiasaan. Apabila menangani isu merentas domain, kami biasanya melibatkan penggunaan dan pengurusan sesi. Walau bagaimanapun, disebabkan oleh sekatan dasar asal penyemak imbas, sesi tidak boleh dikongsi secara lalai merentas domain. Untuk menyelesaikan masalah ini, kita perlu menggunakan beberapa teknik dan kaedah untuk mencapai perkongsian sesi merentas domain. 1. Penggunaan kuki yang paling biasa untuk berkongsi sesi merentas domain

JavaScriptCookies Menggunakan kuki JavaScript ialah cara paling berkesan untuk mengingati dan menjejaki keutamaan, pembelian, komisen dan maklumat lain. Maklumat diperlukan untuk pengalaman pelawat yang lebih baik atau statistik tapak web. PHPCookieCookies ialah fail teks yang disimpan pada komputer pelanggan dan disimpan untuk tujuan penjejakan. PHP secara telus menyokong kuki HTTP. Bagaimanakah kuki JavaScript berfungsi? Pelayan anda menghantar beberapa data ke penyemak imbas pelawat anda dalam bentuk kuki. Pelayar boleh menerima kuki. Jika ada, ia akan disimpan pada pemacu keras pelawat sebagai rekod teks biasa. Sekarang, apabila pelawat mencapai halaman lain di tapak

Pengesahan borang adalah pautan yang sangat penting dalam pembangunan aplikasi web Ia boleh menyemak kesahihan data sebelum menyerahkan data borang untuk mengelakkan kelemahan keselamatan dan ralat data dalam aplikasi. Pengesahan borang untuk aplikasi web boleh dilaksanakan dengan mudah menggunakan Golang Artikel ini akan memperkenalkan cara menggunakan Golang untuk melaksanakan pengesahan borang untuk aplikasi web. 1. Elemen asas pengesahan borang Sebelum memperkenalkan cara melaksanakan pengesahan borang, kita perlu mengetahui apakah elemen asas pengesahan borang. Unsur bentuk: unsur bentuk ialah

Piawaian web ialah satu set spesifikasi dan garis panduan yang dibangunkan oleh W3C dan organisasi lain yang berkaitan Ia termasuk penyeragaman HTML, CSS, JavaScript, DOM, kebolehcapaian Web dan pengoptimuman prestasi Dengan mengikut piawaian ini, keserasian halaman boleh dipertingkatkan. kebolehcapaian, kebolehselenggaraan dan prestasi. Matlamat standard web adalah untuk membolehkan kandungan web dipaparkan dan berinteraksi secara konsisten pada platform, pelayar dan peranti yang berbeza, memberikan pengalaman pengguna yang lebih baik dan kecekapan pembangunan.

Kokpit ialah antara muka grafik berasaskan web untuk pelayan Linux. Ia bertujuan terutamanya untuk memudahkan pengurusan pelayan Linux untuk pengguna baharu/pengguna pakar. Dalam artikel ini, kami akan membincangkan mod akses Cockpit dan cara menukar akses pentadbiran kepada Cockpit daripada CockpitWebUI. Topik Kandungan: Mod Kemasukan Kokpit Mencari Mod Akses Kokpit Semasa Dayakan Capaian Pentadbiran untuk Kokpit daripada CockpitWebUI Melumpuhkan Capaian Pentadbiran untuk Kokpit daripada CockpitWebUI Kesimpulan Mod Kemasukan Kokpit Kokpit mempunyai dua mod capaian: Capaian Terhad: Ini adalah lalai untuk mod capaian kokpit. Dalam mod akses ini anda tidak boleh mengakses pengguna web dari kokpit

Web ialah rangkaian kawasan luas global, juga dikenali sebagai World Wide Web, yang merupakan bentuk aplikasi Internet. Web ialah sistem maklumat berdasarkan hiperteks dan hipermedia, yang membolehkan pengguna melompat antara halaman web yang berbeza melalui hiperpautan untuk menyemak imbas dan mendapatkan maklumat. Asas Web ialah Internet, yang menggunakan protokol dan bahasa yang bersatu dan piawai untuk membolehkan pertukaran data dan perkongsian maklumat antara komputer yang berbeza.

PHP tergolong dalam bahagian belakang dalam pembangunan web. PHP ialah bahasa skrip sebelah pelayan, terutamanya digunakan untuk memproses logik sebelah pelayan dan menjana kandungan web dinamik. Berbanding dengan teknologi bahagian hadapan, PHP lebih banyak digunakan untuk operasi bahagian belakang seperti berinteraksi dengan pangkalan data, memproses permintaan pengguna dan menjana kandungan halaman. Seterusnya, contoh kod khusus akan digunakan untuk menggambarkan aplikasi PHP dalam pembangunan back-end. Mula-mula, mari kita lihat contoh kod PHP mudah untuk menyambung ke pangkalan data dan menanyakan data:
