java代码
package com.bjhm.util;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;
public class SessionFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
//request.getSession().setAttribute("loginedUser", "ssss");
// 不过滤的uri
String[] notFilter = new String[] {"tmLogin","logOut"};
// 请求的uri
String uri = request.getRequestURI();
// 从session中获取登录者id
String ho_user_id = (String)request.getSession().getAttribute("ho_user_id");
// uri中包含background时才进行过滤
if (uri.indexOf(".ld") != -1 || uri.indexOf(".json") != -1) {
// 是否过滤
boolean doFilter = true;
for (String s : notFilter) {
if (uri.indexOf(s) != -1) {
// 如果uri中包含不过滤的uri,则不进行过滤
doFilter = false;
break;
}
}
if (doFilter) {
// 执行过滤
if(uri.indexOf(".ld") != -1){
if (null == ho_user_id) {
// 如果session中不存在登录者实体,则弹出框提示重新登录
// 设置request和response的字符集,防止乱码
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String loginPage = "/";
StringBuilder builder = new StringBuilder();
builder.append("<script type=\"text/javascript\">");
builder.append("alert('网页过期,请重新登录');");
builder.append("window.top.location.href='");
builder.append(loginPage);
builder.append("';");
builder.append("</script>");
out.print(builder.toString());
} else {
// 如果session中存在登录者实体,则继续
filterChain.doFilter(request, response);
}
}
if(uri.indexOf(".json") != -1){
if(null == ho_user_id){
response.setHeader("REDIRECT", "REDIRECT");//告诉ajax这是重定向
response.setHeader("CONTEXTPATH", "/");//重定向地址
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
System.err.println(response+"\n"+response.getHeader("CONTEXTPATH"));
return;
}else {
// 如果session中存在登录者实体,则继续
filterChain.doFilter(request, response);
}
}
} else {
// 如果不执行过滤,则继续
filterChain.doFilter(request, response);
}
} else {
// 如果uri中不包含background,则继续
filterChain.doFilter(request, response);
}
}
}
ajax方式访问的需要在js处理返回的数据
$.ajaxSetup( {
//设置ajax请求结束后的执行动作
complete : function(XMLHttpRequest, textStatus) {
// 通过XMLHttpRequest取得响应头,REDIRECT
var redirect = XMLHttpRequest.getResponseHeader(“REDIRECT”);//若HEADER中含有REDIRECT说明后端想重定向
if (redirect == “REDIRECT”) {
var win = window;
while (win != win.top){
win = win.top;
}
alert(‘网页过期,请重新登录’);
//将后端重定向的地址取出来,使用win.location.href去实现重定向的要求
win.location.href= XMLHttpRequest.getResponseHeader(“CONTEXTPATH”);
}
}
});