之前的版本是 v0.2.1 保持登錄狀態(tài)的版本午绳,這一次 v0.2.2 是對驗證登錄過程的一個更新,用攔截器和過濾器來進(jìn)行,發(fā)現(xiàn)這種方式省去了一些邏輯的實現(xiàn)
Registration-login-interface2
Version 0.2.2
新增的功能都是在 v0.2.1 的基礎(chǔ)上進(jìn)行修改,刪去部分代碼
可通過點擊 tag 來查看之前的代碼:
1. 新增功能
使用 mvc 的攔截器來對特定頁面進(jìn)行攔截谚殊,攔截之后跳轉(zhuǎn)至登錄界面
使用過濾器來進(jìn)行相同功能的攔截
2. 刪去的代碼
先刪除 ExceptionService 中的 statusException 方法,刪去對應(yīng)的實現(xiàn)蛤铜,然后在 UserServiceImpl 和 Controller 中刪去調(diào)用它的代碼
這樣嫩絮,就變成了不檢測用戶是否登錄
3. 攔截器
首先新建一個包:interceptor
然后新建一個類:LoginInterceptor,實現(xiàn)了 HandlerInterceptor 接口:
關(guān)于 HandlerInterceptor 的使用這里不講述围肥,如果在 session 中沒有獲得 username 屬性剿干,就跳轉(zhuǎn)到登錄頁面
攔截是有范圍的,在下文的配置文件中自行配置需要攔截的頁面
public class LoginInterceptor implements org.springframework.web.servlet.HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o) throws Exception {
HttpSession session = httpServletRequest.getSession();
if (session.getAttribute("username") == null){
httpServletResponse.sendRedirect("preLogin.action");
} else {
return true;
}
return false;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
在 spring-mvc.xml 中添加攔截器的配置:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/userStatus.action"/>
<mvc:mapping path="/showInfo.action"/>
<mvc:mapping path="/setUserInfo.action"/>
<bean class="interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
對指定路徑進(jìn)行映射穆刻,LoginInterceptor 中的操作就是對映射的路徑而言的怨愤,然后指定一下攔截器所在位置,就完成了
效果
運(yùn)行之后蛹批,在瀏覽器地址欄輸入
- localhost:8080/userStatus.action
- localhost:8080/showInfo.action
- localhost:8080/setUserInfo.action
就會跳轉(zhuǎn)到 http://localhost:8080/preLogin.action
攔截器的部分就結(jié)束了
4. 過濾器
將 spring-mvc.xml 中配置的攔截器信息注釋掉,然后新建包:filter篮愉,包中新建類 LoginFilter腐芍,實現(xiàn) javax.servlet.Filter 接口:
public class LoginFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
if (((HttpServletRequest) servletRequest).getSession().
getAttribute("username") == null){
((HttpServletResponse)servletResponse).sendRedirect("preLogin.action");
} else {
filterChain.doFilter(servletRequest,
servletResponse);
}
}
}
如果檢測出沒有登錄,就會跳轉(zhuǎn)到登錄界面试躏,有一點要注意:filterChain.doFilter(servletRequest, servletResponse);
是一定要寫的猪勇,如果不寫,在登錄之后颠蕴,就不能訪問那些需要登錄才能訪問的頁面的泣刹,相當(dāng)于請求已經(jīng)被過濾器中斷了,如果檢測出已登錄犀被,就要加上這一行代碼才能方位個人信息頁面
然后在 web.xml 中添加一個過濾器的配置:
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>/showInfo.action</url-pattern>
<url-pattern>/userStatus.action</url-pattern>
<url-pattern>/setUserInfo.action</url-pattern>
</filter-mapping>
這樣子椅您,不同于 v0.2.1 的驗證登錄方式就做完了