package com.hehenian.login.filter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
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 org.apache.log4j.Logger;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.util.StringUtils;
/**
*
* 用来跳转到统一的登录认证中心
*
* 系统需要配置登录URL
* 并且将用户访问的url传递给登录中心, 登录成功后跳回用户想访问的url
* 参数名称: fromUrl
*
*
*/
public class UserLoginFilter implements Filter {
protected String loginView;
protected String mobileLoginView;
Logger logger = Logger.getLogger(this.getClass());
public String getLoginView() {
return loginView;
}
public void setLoginView(String loginView) {
this.loginView = loginView;
}
public String getMobileLoginView() {
return mobileLoginView;
}
public void setMobileLoginView(String mobileLoginView) {
this.mobileLoginView = mobileLoginView;
}
public UserLoginFilter() {}
public void destroy() {}
/**
*
* 过滤掉不需要登录就可以查看的url
* 其他url 都先检测是否登录过, 没有重定向到登录中心
*
*
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse) response;
String uri = req.getRequestURI();
//String fromUrl =req.getScheme()+"://"+req.getServerName()+":"+req.getServerPort()+uri;
HttpSession session = req.getSession();
setParameter(session, new HashMap(req.getParameterMap()));
if (uri.equals("/") ||uri.endsWith("/house.do") ||uri.endsWith("/calCreditAmount.do") ||uri.endsWith("/calRepayDetail.do") ||uri.endsWith("/addLoanDetail.do") ||uri.endsWith("/getByIdNo.do") ||uri.indexOf(".ico")!=-1 ||uri.indexOf("/css/")!=-1||uri.indexOf("/web_res/")!=-1||uri.indexOf("/js/")!=-1){
chain.doFilter(request, response);
}else {
Object obj = session.getAttribute("user");
ObjectMapper userJsonMap = new ObjectMapper();
Map userMap = userJsonMap.convertValue(obj,Map.class);
logger.info("uri:=======>"+uri);
String loginCenterUrl = loginView;
if (obj == null || StringUtils.isEmpty(userMap.get("id"))) {
if (uri.indexOf("/view/mobile/")>-1){
// logger.info("mobileLoginView:=======>"+mobileLoginView);
loginCenterUrl= mobileLoginView;
}
logger.info("loginView:=======>"+loginCenterUrl);
//add sesionId parameter
uri = uri + ";s="+ session.getId();
uri = java.net.URLDecoder.decode("http://localhost"+uri, "utf-8");
//end add sessionid parameterx`
resp.sendRedirect(loginCenterUrl + ";s="+ session.getId()+"?fromUrl=" + uri);
} else {
chain.doFilter(request, response);
}
}
}
private void setParameter(HttpSession session, Map map){
if (map!=null && map.size()>0){
Map temp=(Map)session.getAttribute("parameterMap");
Map newMap=new HashMap();
if(temp!=null) {
newMap.putAll(temp);
}
if(map!=null) {
newMap.putAll(map);
}
session.setAttribute("parameterMap", newMap);
}
}
public void init(FilterConfig fConfig) throws ServletException {
ServletContext sc=fConfig.getServletContext();
sc.setAttribute("doLoginView", loginView);
sc.setAttribute("mobileLoginView", mobileLoginView);
}
}