代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package com.sunsheen.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.sunsheen.jfids.system.config.Configs;
import com.sunsheen.jfids.system.security.login.Session;

/**
* Servlet 登录过滤器
* @author 92481
*
*/
public class LoginFilter implements Filter {

public LoginFilter() {
}

public void destroy() {
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
//获取url地址
String reqUrl = req.getRequestURI();
// System.out.println("reqURL----------" + reqUrl);

// 登录操作不做页面跳转
if(reqUrl.contains("/hkcloud/login.w.xhtml")
|| reqUrl.contains("/hkcloud/getUser")
|| reqUrl.contains("/hkcloud/login")
|| reqUrl.contains("/static/")
|| reqUrl.endsWith(".css")
|| reqUrl.endsWith(".js")){

chain.doFilter(request, response);
return;
}

HttpSession session = Session.getHttpSession();
String apiKey = (String) session.getAttribute("ApiKey");

HttpServletResponse res = (HttpServletResponse) response;
// 如果session中存在apiKey证明用户登录,可以放行。否则认为未登陆重定向到登录界面
if (apiKey == null || apiKey.equals("")) {
// 登录页面地址
String loginUrl = Configs.get("AllConfig.loginUrl");
//如果request.getHeader("X-Requested-With") 返回的是"XMLHttpRequest"
//说明就是ajax请求,需要特殊处理
if("XMLHttpRequest".equals(req.getHeader("X-Requested-With"))){
//告诉ajax我是重定向
res.setHeader("redirect", "redirect");
//告诉ajax我重定向的路径
res.setHeader("url", req.getContextPath() + loginUrl);
res.setStatus(HttpServletResponse.SC_FORBIDDEN);
return;
}else{
res.sendRedirect(req.getContextPath() + loginUrl);
}
} else {
chain.doFilter(request, response);
return;
}
}

public void init(FilterConfig fConfig) throws ServletException {
}
}

注:

ajax请求返回重定向信息

在项目中,考虑到web前台ajax请求未登录资源时,后台返回的重定向信息,ajax不能自动判断是否是重定向,以下是一种折中方法:

前端jquery.ajax默认设置,ajax设置要放在程序ajax调用前,我一般放在公共js中统一引用到文件头里的,这样调用ajax的时候就无需操心其他设置了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* ajax默认设置 包括默认提交方式为POST, 判断后台是否是重定向
*/
$.ajaxSetup({
// 设置ajax请求结束后的执行动作
complete : function(XMLHttpRequest, textStatus) {
// 通过XMLHttpRequest取得响应头,redirect
var redirect = XMLHttpRequest.getResponseHeader("redirect");
if (redirect == "redirect") { // 若HEADER中含有redirect说明后端想重定向
var win = window;
while (win != win.top) {
win = win.top;
}
// 将后端重定向的地址取出来,使用win.location.href去实现重定向的要求
win.location.href = XMLHttpRequest.getResponseHeader("url");
}
},
type : 'POST'
});