經過filter來將記住一個月以內的自動登陸,經過interceptor來將不在範圍以內的請求都讓其跳轉到指定的頁面好比登錄頁面
html
myFilter:
web
web.xml:ajax
<filter>spring
<filter-name>myFilter</filter-name>json
<filter-class>com.chenghan.yun.mp.filter.SysFilter</filter-class>數組
</filter>瀏覽器
<!-- 只攔截.do請求 -->cookie
<filter-mapping>session
<filter-name>myFilter</filter-name>mvc
<url-pattern>*.do</url-pattern>
</filter-mapping>
class:
public class SysFilter implements Filter {
private IMpBasInfoService mpBasInfoService;
private IBasDao basDao;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//To change body of implemented methods use File | Settings | File Templates.
ServletContext context = filterConfig.getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
mpBasInfoService = (IMpBasInfoService) ctx.getBean("mpBasInfoService");
basDao =(IBasDao)ctx.getBean("basDao");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//To change body of implemented methods use File | Settings | File Templates.
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpSession session = request.getSession(true);
String account = "";
String sessionId = ""; // 此sessionid是上次用戶登陸時保存於用戶端的識別碼,用於用戶後續訪問的自動登陸。不是本次訪問的session id。
Cookie[] cookies;
CookieManager cm = new CookieManager(); // CookieManager是一個自定義的類,用於從Cookie數組中查找並返回指定名稱的Cookie值。
boolean isAutoLogin;
// 若是session中沒有user對象,則建立一個。
CrmMicroBusinessCardVO crmMicroBusinessCardVO = (CrmMicroBusinessCardVO) session.getAttribute("crmMicroBusinessCardVO");
// 若是user對象的username爲"",表示用戶未登陸。則執行自動登陸過程。
// 不然不自動登陸。
if (crmMicroBusinessCardVO == null) {
crmMicroBusinessCardVO = new CrmMicroBusinessCardVO();
// 檢查用戶瀏覽器是否發送了上次登陸的用戶名和sessionid,
// 若是是,則爲用戶自動登錄。
cookies = request.getCookies();
if(cookies!=null&&cookies.length>0){
account = cm.getCookieValue(cookies, "autoLoginUser");
sessionId = cm.getCookieValue(cookies, "sessionId");
account = "".equals(account)?null:account;
sessionId = "".equals(sessionId)?null:sessionId;
Map<String,Object> map = new HashMap<String,Object>();
map.put("account", account);
map.put("sessionId",sessionId);
boolean isExist = basDao.isExist(MpAccountSessionId.class,map);
if (isExist) {
MpBasInfo userVO = new MpBasInfo();
userVO = basDao.queryOne(MpBasInfo.class,"account",account);
if(userVO!=null){
CrmMicroBusinessCardVO crmMicroBusinessCardVO1 = new CrmMicroBusinessCardVO();
UtilBean.copyBeanAllSimpleProperties(crmMicroBusinessCardVO1,userVO,false);
session.setAttribute("crmMicroBusinessCardVO", crmMicroBusinessCardVO1); // 將user bean添加到session中。
}
}
}
}
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
//To change body of implemented methods use File | Settings | File Templates.
}
}
public class CookieManager {
public static String getCookieValue(Cookie cookies[],String cookieName){
String cookieValue = "";
for(int i=0;i<cookies.length;i++){
Cookie cookie = cookies[i];
if(cookie.getName().equals(cookieName)){
cookieValue = cookie.getValue().toString();
break;
}
}
return cookieValue;
}
}
interceptor:springMVC的
public class SimpleAcInterceptor implements HandlerInterceptor {
public String[] allowUrls;//還沒發現能夠直接配置不攔截的資源,因此在代碼裏面來排除
public void setAllowUrls(String[] allowUrls) {
this.allowUrls = allowUrls;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String contextPath=request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+contextPath+"/";
String requestUrl = request.getRequestURI().replace(contextPath, "");
if(allowUrls == null){
//設置模塊allowUril
allowUrls = new String[]{"/login.html"};
}
if(null != allowUrls && allowUrls.length>=1){
for(String url : allowUrls) {
if(requestUrl.contains(url)) {
return true;
}
}
}
CrmMicroBusinessCardVO crmMicroBusinessCardVO = (CrmMicroBusinessCardVO) request.getSession().getAttribute("crmMicroBusinessCardVO");
if(crmMicroBusinessCardVO == null){
if (!(request.getHeader("accept").indexOf("application/json") > -1 ||
(request.getHeader("X-Requested-With")!= null &&
request.getHeader("X-Requested-With").indexOf("XMLHttpRequest") > -1))) {
//非JSON請求
response.sendRedirect(basePath + "login.html");
}else{
PrintWriter fs=response.getWriter();
Map<String,String> map = new HashMap<String,String>();
map.put("status","errors");
map.put("message","系統超時,請從新登陸。");
response.setContentType("application/json");
fs.write(JsonUtils.getJsonString(map));
fs.flush();
fs.close();
}
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//To change body of implemented methods use File | Settings | File Templates.
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//To change body of implemented methods use File | Settings | File Templates.
}
}
springMVC的配置文件
<mvc:interceptors>
<!-- session超時 -->
<mvc:interceptor>
<mvc:mapping path="/*"/>
<bean class="com.chenghan.yun.mp.filter.SimpleAcInterceptor">
<property name="allowUrls">
<list>
<!-- 若是請求中包含如下路徑,則不進行攔截 -->
<value>/login.html</value>
<value>/crm_micro_business_card_loginOut.html</value>
<value>/mp_ajax_vcf.html</value>
<value>/crm_micro_business_card_resetPassword_index_card.do</value>
<value>/crm_micro_business_card_resetPassword_card.do</value>
<value>/crm_micro_business_card_validate_index_card.do</value>
<value>/crm_micro_business_card_validate_card.do</value>
<value>/crm_micro_business_card_login_card.do</value>
<value>/crm_micro_business_card_registor_index_card.do</value>
<value>/crm_micro_business_card_validate_registor_card.do</value>
<value>/crm_micro_business_card_password_registor_card.do</value>
<value>/crm_micro_business_card_registor_setPassword_card.do</value>
<value>/business_card_businessCardFinishRegistor_index.do</value>
<value>/business_card_businessCardFinsishRegistor.json</value>
<value>/crm_micro_business_card_businessCard_index_card.do</value>
<value>/mp_ajax_vcf_index.html</value>
<value>/mp_ajax_vcf.html</value>
<value>/mp_save_relation.json</value>
<value>/crm_micro_business_card_detail.json</value>
</list>
</property>
</bean>
</mvc:interceptor>
</mvc:interceptors>