springMVC 整合 shiro 時,配置了當訪問某個URL沒有權限時的配置處理:java
<!-- 經過unauthorizedUrl指定沒有權限操做時跳轉頁面 -->
<property name="unauthorizedUrl" value="/refuse"/>web
可是,上面的配置沒有效果,就是當用戶沒有權限的時候不會運行"/refuse"這個URL路徑,而是直接在頁面顯示出UnauthorizedException錯誤信息。spring
現提供如下幾種解決方案:apache
1. 在控制器上添加 @ExceptionHandler()統一處理某個類異常:mvc
/** * 訪問某個URL沒有權限時拋出UnauthorizedException, * @ExceptionHandler({UnauthorizedException.class})註解表示處理:UnauthorizedException 異常, * 當異常出現時,返回 refuse 視圖。 */ @ExceptionHandler({UnauthorizedException.class}) public ModelAndView processUnauthenticatedException(NativeWebRequest request, UnauthorizedException e) { ModelAndView mv = new ModelAndView(); mv.addObject("exception", e.getMessage()); mv.setViewName("refuse"); return mv; }
當在訪問本控制器時,出現UnauthorizedException異常,則統一跳轉到refuse視圖。可是此方案須要在每一個控制器中實現。重複代碼較多。app
2. 在springmvc的配置文件中來統一處理異常方案jsp
<!-- shiro爲集成springMvc 攔截異常 --> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <!-- 這裏你能夠根據須要定義N多個錯誤異常轉發 --> <prop key="org.apache.shiro.authz.UnauthorizedException">refuse</prop> <prop key="org.apache.shiro.authz.UnauthenticatedException">refuse</prop> <prop key="java.lang.IllegalArgumentException">/error</prop> <!-- 參數錯誤(bizError.jsp) --> <prop key="java.lang.Exception">/error</prop> </props> </property> </bean>
這樣子的話,就只在SpringMVC配置文件配置一處就能夠了。code