SpringMVC和Mybatis(五)RESTful架構、攔截器、攔截器應用

RESTful架構
1.對url進行規範,寫成RESTful格式的url
普通url:http://.../queryItems.action?id=001&type=T01
RESTful的url:http://.../items/001
特點簡潔,將參數通過url傳到服務器
2.http的方法進行規範
不管是刪除、添加、更新。。使用url是一致的,如果進行刪除,需要設置http的方法爲delete,同理添加設
置post,更新put
後臺controller方法:判斷http方法,如果是delete就刪除
3.對http的contentType進行規範
請求時指定contentType,要json,就設置成json格式的type。

查詢商品信息,返回json數據。
controller
使用RESTful風格的url進行映射

輸出json,使用@ResponseBody
URL模板映射
@RequestMapping(value="/viewItems/{id}"}:{}爲佔位符,請求的URL可以
是"/viewItems/1"或"/viewItems/2",通過在方法中使用@PathVariable獲取{}的變量

@RequestMapping("/itemsView/{id}/{type}")

ItemsController.java

public @ResponseBody ItemsCustom itemsView(@PathVariable("id") Integer 
id,@PathVariable("type") Integer type)throws Exception{
ItemsCustom itemsCustom = itemsService.findItemsById(id);
return itemsCustom;
}
最重要要再配置一個RESTful的前端控制器
web.xml
<!-- springmvc前段控制器,RESTful -->
  <servlet>
  <servlet-name>springmvc_rest</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:spring/springmvc.xml</param-value>
  </init-param>
  </servlet>
  
  <servlet-mapping>
  <servlet-name>springmvc_rest</servlet-name>
  <url-pattern>/</url-pattern>
  </servlet-mapping>

最終訪問:http://localhost:8081/springmvc_mybatistest/items/itemsView/1

對靜態資源的解析因爲在url-partten中指定/,對靜態資源無法解析。
在springmvc.xml中添加靜態資源解析的方法
<!-- 靜態資源的解析 包括js、css、img -->
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/img/" mapping="/img/**"/>
=============================================================================
攔截器
創建interceptor的包創建HandlerInterceptor1.java
1.springmvc針對HandlerMapping進行攔截設置。
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="handlerInterceptor1" />
<ref bean="handlerInterceptor2" />
</list>
</property>
</bean>
<bean id="handlerInterceptor1" class="springmvc.interceptor.HandlerInterceptor1" />
<bean id-"handlerInterceptor2" class="springmvc.interceptor.HandlerInterceptor2" />
一般不推薦使用,麻煩

2.springmvc還可以配置類似全局的攔截器。會自動注入到每個HandlerMapping中。
<!-- 攔截器 -->
<mvc:interceptors>
<!-- 配置多個,順序執行 -->
<mvc:interceptor>
<!-- 攔截包括子url路徑 -->
<mvc:mapping path="/**"/>
<bean class="cn.itcast.ssm.interceptor.HandlerInterceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itcast.ssm.interceptor.HandlerInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
</beans>

多個攔截器各個方法的執行
1.兩個攔截器都放行,改return true
Interceptor1...preHandler
Interceptor2...preHandler
Interceptor2...postHandler
Interceptor1...postHandler
Interceptor2...afterCompletion
Interceptor1...afterCompletion
preHandler按順序執行
postHandler和afterCompletion按逆向順序執行
2.攔截器1放行,攔截器2不放行
Interceptor1...preHandler
Interceptor2...preHandler
Interceptor1...afterCompletion
攔截器1放行,攔截器2preHandler纔會執行
攔截器2preHandler執行,攔截器其他不放行
只要有一個攔截器不放行,post方法就一定不會放行
3.攔截器1不放行,攔截器2不放行
Interceptor1...preHandler
只有按順序1執行了開始

重要:在afterCompletion可以做日誌的處理,只能放在第一個Handler攔截器裏,並且一定是放行。統一日
志放在登錄認證攔截器之前preHandler。權限校驗的攔截器,放在登錄認證攔截器之後afterCompletion。
======================================================================================
攔截器應用
判斷請求的url是公開地址(無需登錄即可訪問的url),放行
1.登錄的controller方法
LoginController.java
@Controller
public class LoginController {
//登錄
@RequestMapping("/login")
public String login(HttpSession session,
String username,String password)throws Exception{
//調用service進行用戶驗證
//session中保存用戶信息
session.setAttribute("username", username);

return "redirect:/items/queryItems.action";
}
//退出
@RequestMapping("/logout")
public String logout(HttpSession session)throws Exception{
//清除session
session.invalidate();
return "redirect:/items/queryItems.action";
}
}

login.jsp
  <body>
   <form action="${pageContext.request.contextPath }/login.action" method="post">
   username:<input type="text" name="username" /><br />
   password:<input type="password" name="password" /><br />
   <input type="submit" value="登錄">
   </form>
  </body>
</html>

2.登錄認證攔截器實現
LoginInterceptor.java
public class LoginInterceptor implements HandlerInterceptor{

//執行Handler完成之後,統一的異常處理,統一的日誌處理
@Override
public void afterCompletion(HttpServletRequest arg0, 
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub

}

//在Handler方法之後,返回ModelAndView之前,將公用模型數據,菜單導航傳入視圖
@Override
public void postHandle(HttpServletRequest arg0, 
HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub

}

//進入Handler方法之前,身份認證和授權
@Override
public boolean preHandle(HttpServletRequest arg0, 
HttpServletResponse arg1, Object arg2) throws Exception {
//表示攔截
String url = arg0.getRequestURI();
//判斷是否爲公開地址
if (url.indexOf("login.action")>=0) {
return true;
}
//判斷session
HttpSession session = arg0.getSession();
//取出session中用戶信息
String username = (String) session.getAttribute("username");
if (username != null) {
//身份驗證成功
return true;
}
//跳轉到登錄界面
arg0.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(arg0, arg1);
return false;
}

}

配置springmvc.xml
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itcast.ssm.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>

需要把其他interceptor放行
itemsList.jsp
 <body>
  當前用戶:${username },
  <c:if test="${username!=null }">
  <a href="${pageContext.request.contextPath }/logout.action">退出</a>
  </c:if>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章