在spring 3.0甚礎上,起來越多的用到了註解,從前的攔截器在配置文件中須要這樣配置javascript
<beans...> html
... java
<bean id="measurementInterceptor" web
class="com.apress.springrecipes.court.web.MeasurementInterceptor"/> spring
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> session
<property name="interceptors"> mvc
<list> app
<ref bean="measurementInterceptor"/> ide
</list> post
</property>
...
</bean>
<bean class="org.springframework.web.servlet.mvc.support
.ControllerClassNameHandlerMapping">
<property name="interceptors">
<list>
<ref bean="measurementInterceptor"/>
</list>
</property>
</bean>
....
</beans>
· 如今用註解只須要這樣:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*/*.shtml"/>//映射路徑後綴名
<bean class="x.x.x.filter.SessionFilter"/>//自定義攔截器
</mvc:interceptor>
</mvc:interceptors>
SessionFilter.java代碼:
publicclass SessionFilter implements HandlerInterceptor{
@Override
publicbooleanpreHandle(HttpServletRequest request,HttpServletResponse response, Object o) throws Exception{
// 後臺session控制
Objectuser=request.getSession().getAttribute("username");
String returnUrl = request.getRequestURI();
if(null==user){
if(returnUrl.equals("/public/getImg.shtml")||returnUrl.equals("/public/checkLogin.shtml")||returnUrl.equals("/public/login.shtml")||returnUrl.equals("/public/logOut.shtml")){
returntrue;
}else{
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out =response.getWriter();
StringBuilder builder = new StringBuilder();
builder.append("<script type=\"text/javascript\"charset=\"UTF-8\">");
builder.append("alert(\"請從新登錄!\");");
builder.append("window.location.href=\"/public/login.shtml\";");
builder.append("</script>");
out.print(builder.toString());
out.close();
returnfalse;
}
}
returntrue;
}
@Override
publicvoidpostHandle(HttpServletRequest httpServletRequest, HttpServletResponse response,Object o, ModelAndView modelAndView) throws Exception {
}
@Override
publicvoidafterCompletion(HttpServletRequest httpServletRequest,HttpServletResponse response, Object o, Exception e) throws Exception{
}
/**
* @paramrequest
* @returnCreate Date:2016-07-31
* Description:獲取IP
*/
private String getIpAddr(HttpServletRequestrequest) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
}
這個攔截器的目的就是:用戶所屬的session不存在後進行對控制器請求的攔截,使跳轉到首頁。對於HandlerInterceptor這個類這裏很少說,網上有的可能說的更好,這裏只簡單說下它的三個方法,preHandle、postHandle和afterCompletion。
(1)preHandle(WebRequest request) 方法。該方法將在請求處理以前進行調用,也就是說會在Controller 方法調用以前被調用。這個方法跟HandlerInterceptor中的preHandle 是不一樣的,主要區別在於該方法的返回值是void,也就是沒有返回值,因此咱們通常主要用它來進行資源的準備工做,好比咱們在使用hibernate 的時候能夠在這個方法中準備一個Hibernate 的Session 對象,而後利用WebRequest 的setAttribute(name, value, scope)把它放到WebRequest 的屬性中。這裏能夠說說這個setAttribute 方法的第三個參數scope ,該參數是一個Integer類型的。在WebRequest 的父層接口RequestAttributes 中對它定義了三個常量:
SCOPE_REQUEST :它的值是0 ,表明只有在request 中能夠訪問。
SCOPE_SESSION :它的值是1 ,若是環境容許的話它表明的是一個局部的隔離的session,不然就表明普通的session,而且在該session範圍內能夠訪問。
SCOPE_GLOBAL_SESSION :它的值是2 ,若是環境容許的話,它表明的是一個全局共享的session,不然就表明普通的session,而且在該session 範圍內能夠訪問。
(2)postHandle(WebRequest request, ModelMap model) 方法。該方法將在請求處理以後,也就是在Controller 方法調用以後被調用,可是會在視圖返回被渲染以前被調用,因此能夠在這個方法裏面經過改變數據模型ModelMap 來改變數據的展現。該方法有兩個參數,WebRequest 對象是用於傳遞整個請求數據的,好比在preHandle 中準備的數據均可以經過WebRequest 來傳遞和訪問;ModelMap 就是Controller 處理以後返回的Model 對象,咱們能夠經過改變它的屬性來改變返回的Model 模型。
(3)afterCompletion(WebRequest request, Exception ex) 方法。該方法會在整個請求處理完成,也就是在視圖返回並被渲染以後執行。因此在該方法中能夠進行資源的釋放操做。而WebRequest 參數就能夠把咱們在preHandle 中準備的資源傳遞到這裏進行釋放。Exception 參數表示的是當前請求的異常對象,若是在Controller中拋出的異常已經被spring 的異常處理器給處理了的話,那麼這個異常對象就是是null 。