最近 Spring—MVC 项目, 定义的过滤器类:
代码如下:
package com.cmcc.soc.aop;
import org.springframework.web.filter.OncePerRequestFilter; // 过滤器类 需要 实现的 每次请求都过滤的类
import javax.servlet.FilterChain; //请求的 处理链
import javax.servlet.ServletException; //servlet 的异常
import javax.servlet.http.HttpServletRequest; //http 的请求
import javax.servlet.http.HttpServletResponse; //http 的响应
import java.io.IOException; //io 流异常
import java.io.PrintWriter; // 字符输出流
/**
* Project: soc
* User: Henry
* Date: 13-7-26
* Description:
* Modify Memo:
*/
public class AuthenticationFilter extends OncePerRequestFilter {//继承一个 每次都过滤的过滤器类
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
// 不过滤的uri
String[] notFilter = new String[] { "/Login/Login.do","/Home/Index.do"};// 设置不过滤的uri
// 请求的uri
String contextpath = request.getContextPath(); //获取上下文的路径
String spring_uri = request.getRequestURI().replace(contextpath, ""); //获取 请求的 uri
boolean doFilter = true;// 简写 doFiter 为true 时 会执行下面的
for (String s : notFilter) { //遍历 不过滤的uri
if (spring_uri.equals(s)) { //取过 获取的uri 包含不过滤的 uri doFiter 返回false
// 如果uri中包含不过滤的uri,则不进行过滤
doFilter = false;
break; //退出 循环
}
}
if (doFilter) {
Object obj = request.getSession().getAttribute("user");//获取session 中的值
if (null == obj) { //如果session中的值是空的话 设置 响应
// 如果session中不存在登录者实体,则弹出框提示重新登录
// 设置request和response的字符集,防止乱码
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();// 字符输出流
String loginPage = "/Login/Login.do";//登录页
StringBuilder builder = new StringBuilder();
//javascript
builder.append("<script type=\"text/javascript\">");
builder.append("alert('网页过期,请重新登录!');");
builder.append("window.top.location.href='");// 地址转到
builder.append(contextpath);//项目 路径
builder.append(loginPage);// 登录页
builder.append("';");
builder.append("</script>");
out.print(builder.toString()); //输出
} else {
// 如果session中存在登录者实体,则继续
filterChain.doFilter(request, response);
}
} else {
// 如果不执行过滤,则继续
filterChain.doFilter(request, response);
}
}
}