Home  >  Article  >  php教程  >  Example code that automatically jumps to the login page after the session expires

Example code that automatically jumps to the login page after the session expires

高洛峰
高洛峰Original
2017-01-07 09:36:152260browse

I recently worked on a project where there was a need to implement the automatic login function. After consulting relevant information, I planned to use session monitoring to do it. Here is a list of how to configure the listener:

1. Add the following code to the project's web.xml file:

<!--添加Session监听器-->
<listener>
<listener-class> 监听器路径 </listener-class>
</listener>

2. Write a java class.

public class SessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent arg0) {
// session创建时执行
SimpleDateFormat simpleFormat = new SimpleDateFormat("mm-ss-ms");
String nowtimes = simpleFormat.format(new Date());
User u=null;
//System.out.println("执行。。 当前时间:"+nowtimes+"_"+u);
HttpSession ses= arg0.getSession();
String id=ses.getId()+"_"+ses.getCreationTime();
}
public void sessionDestroyed(HttpSessionEvent arg0) {
// session失效时执行
SimpleDateFormat simpleFormat = new SimpleDateFormat("mm-ss-ms");
String nowtimes = simpleFormat.format(new Date());
//System.out.println("session失效了。。 结束时间: "+nowtimes);
}
}

After the configuration is completed and the session expires, it successfully enters the sessionDestroyed method and prepares to perform the page jump operation. Suddenly, I discovered how to write a jump. I was stunned and continued. I consulted the experts on the Internet and found that this monitoring is for background statistical processing and cannot realize the page jump function.

We can only give up this method and start using filters to implement

1. Add filter configuration in web.xml

<filter>
<filter-name>sessionFilter</filter-name>
<filter-class>com.orchestrall.web.helper.session.SessionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sessionFilter</filter-name>
<url-pattern>/actions/*</url-pattern>
</filter-mapping>

2. Create a new SessionFilter class and implement the Filter interface.

public class SessionFilterimplements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
HttpSession session = httpRequest.getSession();
// 登陆url
String loginUrl = httpRequest.getContextPath() + "/admin/login.jsp";
String url = httpRequest.getRequestURI();
String path = url.substring(url.lastIndexOf("/"));
// 超时处理,ajax请求超时设置超时状态,页面请求超时则返回提示并重定向
if (path.indexOf(".action") != -1
&& session.getAttribute("LOGIN_SUCCESS") == null) {
// 判断是否为ajax请求
if (httpRequest.getHeader("x-requested-with") != null
&& httpRequest.getHeader("x-requested-with")
.equalsIgnoreCase("XMLHttpRequest")) {
httpResponse.addHeader("sessionstatus", "timeOut");
httpResponse.addHeader("loginPath", loginUrl);
chain.doFilter(request, response);// 不可少,否则请求会出错
} else {
String str = "<script language=&#39;javascript&#39;>alert(&#39;会话过期,请重新登录&#39;);"
+ "window.top.location.href=&#39;"
+ loginUrl
+ "&#39;;</script>";
response.setContentType("text/html;charset=UTF-8");// 解决中文乱码
try {
PrintWriter writer = response.getWriter();
writer.write(str);
writer.flush();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
} else {
chain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}

3. Client JS, used for ajax request session timeout

For jquery

<script type="text/javascript">
$(document).ajaxComplete(function(event, xhr, settings) {
if(xhr.getResponseHeader("sessionstatus")=="timeOut"){
if(xhr.getResponseHeader("loginPath")){
alert("会话过期,请重新登陆!");
window.location.replace(xhr.getResponseHeader("loginPath"));
}else{
alert("请求超时请重新登陆 !");
}
}
});
</script>

For extjs ajax request

Ext.Ajax.on(&#39;requestcomplete&#39;,checkUserSessionStatus, this);
function checkUserSessionStatus(conn,response,options){
if(response.getResponseHeader("sessionstatus") == &#39;timeout&#39;){
if(response.getResponseHeader("loginPath")){
alert("会话过期,请重新登陆!");
window.top.location.href = response.getResponseHeader("loginPath");
}else{
alert("请求超时请重新登陆 !");
}
}
}

If an ajax request is not affected by the global method, you can use $ When using the .ajax() method, set the global in the parameter to false. The jquery code is as follows:

$.ajax({
url:"test.html",
global:false//不触发全局ajax事件
})

The above is the Session introduced by the editor. Example code that automatically jumps to the login page after expiration. I hope it will be helpful to everyone. If you want to know more, please pay attention to the PHP Chinese website!

For more related articles on the example code that automatically jumps to the login page after the Session expires, please pay attention to the PHP Chinese website!


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn