目錄
攔截器(interceptor)的作用
攔截器快速入門
案例:用戶登錄權限控制
攔截器方法說明
SpringMVC例外處理
例外處理的思路
例外處理兩種方式
攔截器(interceptor)的作用
Spring MVC的攔截器類似于Servlet開發中的過濾器Filter,用于對處理器進行預處理和后處理,
將攔截器按一定的順序聯結成一條鏈,這條鏈稱為攔截器鏈(Interceptor Chain),在訪問被攔截的方法或欄位時,攔截器鏈中的攔截器就會按其之前定義的順序被呼叫,攔截器也是AOP思想的具體實作,
攔截器和過濾器區別

攔截器快速入門
攔截器快速入門自定義攔截器很簡單,只有如下三步:
①創建攔截器類實作Handlerlnterceptor介面
②配置攔截器
③測驗攔截器的攔截效果
①創建攔截器類實作Handlerlnterceptor介面
public class MyInterceptor1 implements HandlerInterceptor {
//在目標方法執行之前 執行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
System.out.println("preHandle.....");
String param = request.getParameter("param");
if("yes".equals(param)){
return true;
}else{
request.getRequestDispatcher("/error.jsp").forward(request,response);
return false;//回傳true代表放行 回傳false代表不放行
}
}
//在目標方法執行之后 視圖物件回傳之前執行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
modelAndView.addObject("name","itheima");
System.out.println("postHandle...");
}
//在流程都執行完畢后 執行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("afterCompletion....");
}
}
②配置攔截器
<mvc:interceptors>
<mvc:interceptor>
<!--對哪些資源執行攔截操作-->
<mvc:mapping path="/**"/>
<bean class="com.longdi.interceptor.MyInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
③測驗攔截器的攔截效果
@Controller
public class TargetController {
@RequestMapping("/target")
public ModelAndView show(){
System.out.println("目標資源執行......");
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("name","itcast");
modelAndView.setViewName("index");
return modelAndView;
}
}
案例:用戶登錄權限控制
需求:用戶沒有登錄的情況下,不能對后臺選單進行訪問操作,點擊選單跳轉到登錄頁面,只有用戶登錄成功后才能進行后臺功能的操作
public class PrivilegeInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
//邏輯:判斷用戶是否登錄 本質:判斷session中有沒有user
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
if(user==null){
//沒有登錄
response.sendRedirect(request.getContextPath()+"/login.jsp");
return false;
}
//放行 訪問目標資源
return true;
}
}
spring-mvc.xml:
<mvc:interceptors>
<mvc:interceptor>
<!--配置對哪些資源執行攔截操作-->
<mvc:mapping path="/**"/>
<!--配置哪些資源排除攔截操作-->
<mvc:exclude-mapping path="/user/login"/>
<bean class="com.longdi.interceptor.PrivilegeInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>


UserServiceImpl
public User login(String username, String password) {
try {
User user = userDao.findByUsernameAndPassword(username,password);
return user;
}catch (EmptyResultDataAccessException e){
return null;
}
}
UserService
User login(String username, String password);
UserDaoImpl
public User findByUsernameAndPassword(String username, String password) throws EmptyResultDataAccessException {
User user = jdbcTemplate.queryForObject("select * from sys_user where username=? and password=?", new BeanPropertyRowMapper<User>(User.class), username, password);
return user;
}
UserDao
User findByUsernameAndPassword(String username, String password);
攔截器方法說明

SpringMVC例外處理
例外處理的思路
系統中例外包括兩類∶預期例外和運行時例外RuntimeException,前者通過捕獲例外從而獲取例外資訊,后者主要通過規范代碼開發、測驗等手段減少運行時例外的發生,
系統的Dao、Service、Controller出現都通過throws Exception向上拋出,最后由SpringMVC前端控制器交由例外處理器進行例外處理,如下圖:
例外處理兩種方式
1、使用Spring MVC提供的簡單例外處理器SimpleMappingExceptionResolver
SpringMVC已經定義好了該型別轉換器,在使用時可以根據專案情況進行相應例外與視圖的映射配置
2、實作Spring的例外處理介面HandlerExceptionResolver自定義自己的例外處理器
①創建例外處理器類實作HandlerExceptionResolver
public class MyExceptionResolver implements HandlerExceptionResolver {
/*
引數Exception:例外物件
回傳值ModelAndView:跳轉到錯誤視圖資訊
*/
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
if(e instanceof MyException){
modelAndView.addObject("info","自定義例外");
}else if(e instanceof ClassCastException){
modelAndView.addObject("info","類轉換例外");
}
modelAndView.setViewName("error");
return modelAndView;
}
}
②配置例外處理器
<!--自定義例外處理器-->
<bean class="com.longdi.resolver.MyExceptionResolver"/>
③撰寫例外頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>通用的錯誤提示頁面</h1>
<h1>${info}</h1>
</body>
</html>
④測驗例外跳轉


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/333783.html
標籤:java
上一篇:UseOfMethods - 方法的使用 - Java
下一篇:cgb2108-day17
