要想实现此功能,分以下两步:
1.配置web.xml:
LoginFilter
com.yusj.core.filter.LoginFilter
LoginFilter
/*
2.创建过滤器实现类,实现Filter接口:
package com.yusj.core.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;
/**
*
* @ClassName: LoginFilter
* @Description: 登录过滤器
* @author shaojian.yu
* @date 2014年11月3日 下午1:19:28
*
*/
public class LoginFilter implements Filter {
/**
*
* Title:doFilter
* Description: 所有请求都走此过滤器来判断用户是否登录
* user: shaojian.yu
* date: 2014 2014年11月3日
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
@Override
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
// 判断是否是http请求
if (!(servletRequest instanceof HttpServletRequest)
|| !(servletResponse instanceof HttpServletResponse)) {
throw new ServletException(
"OncePerRequestFilter just supports HTTP requests");
}
// 获得在下面代码中要用的request,response,session对象
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
HttpSession session = httpRequest.getSession(true);
String[] strs = { "loginpage", "login", "logout", "static" }; // 路径中包含这些字符串的,可以不用登录直接访问
StringBuffer url = httpRequest.getRequestURL();
/**
* 过滤掉根目录
*/
String path = httpRequest.getContextPath();
String protAndPath = httpRequest.getServerPort() == 80 ? "" : ":"
+ httpRequest.getServerPort();
String basePath = httpRequest.getScheme() + "://"
+ httpRequest.getServerName() + protAndPath + path + "/";
if (basePath.equalsIgnoreCase(url.toString())) {
filterChain.doFilter(servletRequest, servletResponse);
return;
}
// 特殊用途的路径可以直接访问
if (strs != null && strs.length > 0) {
for (String str : strs) {
if (url.indexOf(str) >= 0) {
filterChain.doFilter(servletRequest, servletResponse);
return;
}
}
}
// 从session中获取用户信息
String loginInfo = (String) session.getAttribute("username");
if (null != loginInfo && !"".equals(loginInfo)) {
// 用户存在,可以访问此地址
filterChain.doFilter(servletRequest, servletResponse);
} else {
// 用户不存在,踢回登录页面
String returnUrl = httpRequest.getContextPath() + "/loginpage";
httpRequest.setCharacterEncoding("UTF-8");
httpResponse.setContentType("text/html; charset=UTF-8"); // 转码
httpResponse
.getWriter()
.println(
"
+ returnUrl
+ "\";}else{window.opener.top.location.href=\""
+ returnUrl
+ "\";window.close();}");
return;
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
@Override
public void destroy() {
}
}
工作中遇到,留备用。