簡單的實現登錄攔截及統一異常處理(自定義異常)


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。

可以根據實際情況修改返回方式及返回值。

此后所有的異常,都可以通過自定義異常的方式,交由異常處理類來進行處理,返回結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM