sprng mvc过滤器 过滤重定向和ajax访问方式的session是否存在

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”);
}
}
});

猜你喜欢

转载自blog.csdn.net/weixin_44310277/article/details/87268991