webmvc配置類: 註:registry.addInterceptor(攔截器類對象).addPathPatterns("需要攔截的請求路徑").excludePathPatterns("可以放行的請求路徑"); 攔截器類,這裡為登錄攔截 到這裡實現了簡單的登錄攔截,但是上面通過response對 ...
webmvc配置類:
@Configuration public class WebMvcConfig extends WebMvcConfigurationSupport{ @Override protected void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/user/login"); } }
註:registry.addInterceptor(攔截器類對象).addPathPatterns("需要攔截的請求路徑").excludePathPatterns("可以放行的請求路徑");
攔截器類,這裡為登錄攔截
public class LoginInterceptor implements HandlerInterceptor{ @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { // TODO Auto-generated method stub } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { // TODO Auto-generated method stub } @Override public boolean preHandle(HttpServletRequest hServletRequest, HttpServletResponse hServletResponse, Object object) throws Exception { // 案例採用session存儲登錄用戶,所以從session獲取登錄用戶
HttpSession session = hServletRequest.getSession(); TUser tUser=(TUser)session.getAttribute("user");
// 判斷session里是否能取出用戶 if(tUser==null) { returnErrorMessage(hServletResponse, "當前操作需要先進行用戶登錄"); return false; } return true; } private void returnErrorMessage(HttpServletResponse response, String errorMessage) throws IOException { response.setCharacterEncoding("utf-8"); Map<String, Object> var=new HashMap<>(); var.put("success", false); var.put("errorMessage", errorMessage); response.setContentType("application/json"); PrintWriter out = response.getWriter(); ObjectMapper mapper = new ObjectMapper(); String jsonOfRST =mapper.writeValueAsString(var); out.print(jsonOfRST); out.flush(); } }
到這裡實現了簡單的登錄攔截,但是上面通過response對象獲取的輸出流來寫入錯誤信息,下麵採用自定義異常來處理
異常類
public class UnloggedException extends RuntimeException{ private static final long serialVersionUID = 181074719716690931L; public UnloggedException() { super("當前操作需要先進行登錄"); } }
修改攔截器類的preHandle方法,於是returnErrorMessage方法可以去掉了
@Override public boolean preHandle(HttpServletRequest hServletRequest, HttpServletResponse hServletResponse, Object object) throws Exception { HttpSession session = hServletRequest.getSession(); TUser tUser=(TUser)session.getAttribute("user"); if(tUser==null) { throw new UnloggedException(); } return true; }
最後配置異常處理類
@ControllerAdvice @ResponseBody public class GlobalExceptionHandler { @ExceptionHandler public JSONObject handleException(Exception e) { return ActionHelper.responseFailed(e.getMessage()); } }
上面的返回值及ActionHelper為我使用的返回工具類,依賴為com.alibaba的fastjson,版本參考1.2.49。
可以根據實際情況修改返回方式及返回值。
此後所有的異常,都可以通過自定義異常的方式,交由異常處理類來進行處理,返回結果。