在先後端分離的項目中、前端代碼和後端代碼幾乎不在同一個目錄下,甚至不是在一臺服務器上;我這個項目部署在linux、同一臺服務器,不一樣目錄下;全部的頁面跳轉由前臺路由,後臺只是提供返回的數據;前端
乾貨↓ <!-- Shiro的Web過濾器 -->linux
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <!--用戶登錄不成功--> <property name="loginUrl" value="/unauth.do"/> <property name="filterChainDefinitions"> <value> <!--anon 表示不須要認證以及受權--> <!--authc 表示須要認證 沒有登陸是不能進行訪問的--> <!--perms 表示須要該權限才能訪問的頁面 /user/* = perms[/*] --> <!--roles 表示須要角色才能訪問的頁面 /* = roles[管理員]--> /admin/unauth.do=anon /admin/unauthorized.do=anon /admin/logout.do=anon /admin/validate.do=anon /admin/getRandomCode.do=anon /admin/resetPassword.do=anon /layui/**=anon /res/**=anon /**=authc </value> </property> </bean>
其中loginUrl是後臺的一個接口;給前臺返回的一個自定義狀態碼和消息;前臺捕獲ajax返回的406code,清除session,跳轉登錄界面web
/** * 未登陸,shiro應重定向到登陸界面,此處返回未登陸狀態信息,由前端控制跳轉頁面 * @return */ @ResponseBody @RequestMapping(value = "/unauth") public Result unauth() { return new Result().success(false).error(406).msg(propertiesUtil.getValue("用戶未登陸!")); }
----------------ajax
權限不足時,在springmvc.xml中配置了一個異常處理beanspring
<!-- 異常處理,暫時只處理403無權限異常--> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="org.apache.shiro.authz.UnauthorizedException">/unauthorized.do</prop> <prop key="org.apache.shiro.authz.UnauthenticatedException">/unauthorized.do</prop> </props> </property> </bean>
其中/unauthc.do也是後臺的一個接口,給前臺返回無權限狀態碼
/** * 權限不足,shiro應重定向到403界面,此處返回權限不足信息,由前端控制跳轉頁面 */ @ResponseBody @RequestMapping(value = "/unauthorized") public Result unauthorized(){ return new Result().success(false).error(403).msg(propertiesUtil.getValue("權限不足")); }
--------apache
前臺的的ajax捕獲狀態碼能夠參考ajaxsetup()方法,這裏就不貼出來了後端