Есть много способов реализации функциональной проверки разрешений. Одним из них является использование перехватчика для перехвата запросов, а другой - использовать AOP, чтобы бросить исключения.
Во -первых, используйте перехватчик, чтобы реализовать функцию прыжков на интерфейс входа в систему, когда он не зарегистрирован. Обратите внимание, что AOP здесь не используется, но перехватыватели перехватываются, поскольку AOP обычно входит в метод уровня сервиса, а перехватчик перехватывает запрос из уровня контроллера. Это также сам процессор, который может напрямую прервать прохождение запроса и вернуть представление, в то время как AOP не может.
1. Используйте перехватчик, чтобы реализовать функцию прыжка на интерфейс входа в систему, когда он не зарегистрирован
1.1 Interceptor SecurityInterceptor
пакет com.jykj.demo.filter; import java.io.printwriter; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import javax.servlet.http.httpservelponse; javax.servlet.http.httpsession; import org.springframework.web.servlet.handlerinterceptor; import org.springframework.web.servlet.modelandView; import com.alibaba.fastjson.json; импорт com.jykj.demo.Ut.Helper; com.jykj.demo.util.result; открытый класс Security Interceptor реализует Handlerinterceptor {@Override public boolean prehandle (httpservletrequest, httpservletrespons System.out.println ("SecurityInterceptor:"+request.getContextPath ()+","+request.getRequesturi ()+","+request.getMethod ()); Httpsession session = request.getsession (); if (session.getattribute (helper.session_user) == null) {System.out.println ("AuthorizationException: не вошел в систему!" +request.getMethod ()); if ("post" .EqualsIgnoreCase (request.getMethod ())) {response.setContentType ("text/html; charset = utf-8"); Printwriter Out = response.getWriter (); out.write (json.tojsonstring (новый результат (false, «не вошел в систему!»))); out.flush (); out.close (); } else {response.sendredirect (request.getContextPath ()+"/login"); } вернуть false; } else {return true; }} @Override public void poshandle (httpservlectrequest, httpservletresponse ответ, обработчик объекта, модель и модель модели и исключение {// todplectrequest upogenectrequest, httpservess excloser excloser xecpate, exceptionsersersessessy encemplessy, exception exclovsessyssonsessonsessy excelpson // TODO Автогенерированный метод stub}}1.2.spring-mvc.xml (часть конфигурации перехвата)
<!-Обработка http get запросы для/ресурсов/**, эффективно обслуживая статические ресурсы в каталоге $ {webpparoot}/resources-> <MVC: Resources mapping = "/resources/**" Location = "/"/"/> <MVC: Interceptors> <MVC: Interceptor> <mvcc: mapping path ="/** "/*- as /test /login --> <mvc:mapping path="/**/*.aspx"/><!-- Intercept requests with suffix .aspx --> <mvc:mapping path="/**/*.do"/><!-- Intercept requests with suffix .do --> <mvc:exclude-mapping path="/login"/> <mvc:exclude-mapping path="/signIn"/> <MVC: Exclude Mapping path = "/regist"/> <Bean> </bean> </mvc: receptor> </mvc: receptors>Необходимо указать здесь: пути, перехваченный перехватчиком, предпочтительно с именем суффикса, в противном случае некоторые статические файлы ресурсов будут трудно контролировать, то есть запрос должен иметь унифицированный формат, такой как .do и т. Д., чтобы соответствие и скорость фильтрации было очень быстро. Если это не так, например, использование /** для перехвата всех запросов, скорость рендеринга страницы будет очень медленной, поскольку файл ресурса также перехвачен.
2. Используйте AOP для реализации проверки функциональной разрешения
Проверка разрешения функции также может быть реализована аналогичным образом с помощью перехватчика, но она будет перехватывать все запросы и не имеет хорошей функции фильтрации для запросов, которые не требуют проверки разрешения. Следовательно, он реализован с использованием AOP для указания метода перехвата требуемой проверки.
2.1 разрешение
пакет com.jykj.demo.filter; import java.io.ioexception; импорт java.lang.reflect.method; import org.aspectj.lang.joinpoint; import org.aspectj.lang.reflect.methodsignature; импорт org.spramework.beans.factoration.annotation. com.jykj.demo.annotation.validatepermission; импорт com.jykj.demo.exception.accessdeniedexception; import com.jykj.demo.service.sysuserRolePermService;/*** Секция журнала событий, любой контроллер с @ValidatePermission и @Responsebody Ensistation Arsistation Artectore. * Если нет разрешения, исключено исключение AccessDidieDexception, которое направляет запрос контроллеру, а затем возвращает результат исключения * @author Administrator * *//Public Class Armissepepe {@autowired sysuserRolePermService sysuserRepermService; public void dobefore (joinpoint jp) бросает ioexception {system.out.println ("log ressissionAspect перед методом:" + jp.getTarget (). getClass (). getName () + "." + jp.getSignature (). getName ()); Метод orleasemethod = GetSourceMethod (JP); if (sorucemethod! = null) {validatepermission opera = vitilemethod.getannotation (validatepermission.class); if (oper! = null) {int fidx = Opera.idx (); Object [] args = jp.getArgs (); if (fidx> = 0 && fidx <args.length) {int functionId = (integer) args [fidx]; String rs = sysuserRolepermService.permissionValidate (functionId); System.out.println ("разрешение Validate:"+rs); if (rs.trim (). isempty ()) {return; // нормальный}}}} бросить новый AccessDeniedException («У вас нет разрешения на работу!»); } частный метод getSourcemethod (joinpoint jp) {method proxymethod = ((methodignature) jp.getSignature ()). getMethod (); try {return jp.getTarget (). getClass (). getMethod (proxyMethod.getName (), proxyMethod.getParameterTypes ()); } catch (nosuchmethodexception e) {e.printstacktrace (); } catch (securityException e) {e.printstackTrace (); } return null; }}2.2 Пользовательская аннотация проверка
пакет com.jykj.demo.annotation; импорт java.lang.annotation.documented; импорт java.lang.annotation.elementtype; импорт java.lang.annotation.retention; импорт java.lang.annotation.retentionpolicy; импорт java.lang.nation.target; Аннотация типа тега. Метод, аннотированный этой аннотацией, требует проверки разрешения* /@Target (value = elementType.method) @retention (value = artententypolicy.runtime) @documentedpublic @Interface validepermission { /*** @descript выполнять */ int idx () по умолчанию 0;}ПРИМЕЧАНИЕ. AOP врезается в метод, а не запрос от контроллера, поэтому он не может напрямую вернуться к представлению, чтобы прервать запрос метода, но цель прерывания выполнения метода может быть достигнута путем выбросов исключений. Следовательно, в уведомлении перед тем, как вы напрямую возвращаете метод точки подключения, возвращается через проверку, в противном случае пользовательское исключение AccestEdiedException будет брошено на прерывание выполнения метода точки соединения. Захват исключения может быть захвачен и перенаправлен на представление или запрос через обработчик исключений системы (который можно рассматривать как контроллер). Это достигает цели перехвата запроса. Поэтому необходимо настроить процессор исключений.
2.3 Spring-Mvc.xml (конфигурация процессора исключений и конфигурация AOP)
<Bean> <!-<name = "name =" defaulterrorview "value =" rediret:/error "> </property>-> <name =" exceptionMappings "> <props> <!-<prop key =" com.jykj.demo.exception.authorizationExcept key = "com.jykj.demo.exception.accessdeniedexception"> worths:/accessdied </prop> </props> </property> </bean> <bean id = "AspizePermission"/> <!-Выполнять проверку разрешений функции во всех методах пакета контроллера и его субпакера с @validatepermission и replionbody. proxy-target-class = "true"> <aop: aspision ref = "AspizePermission"> <aop: pointcut id = "pc" Expression = " @annotation (com.jykj.demo.annotation.validatepermission) и @annotation (org.springforkwork.web.bindation.ressonsebody) com.jykj.demo.controller ..*.*(..)) "/> <aop: до pointcut-ref =" pc "method =" dobefore "/> </aop: аспект> </aop: config>
2.4 Аннотация запросов контроллера, которые требуют функциональной проверки
@Requestmapping (value = "/ModuleAccess.do", method = requestMethod.post, provectes = "text/html; charset = utf-8") @responsebody @validatepermission public String moduleaccess (int fid, строковое действие, модуль frmmodule) {system.out.println ("FID+", Action+", Action action:" fiD+", action action ject+". int rs = -1; try {if (helper.f_action_create.equals (action)) {rs = moduleservice.access (module, helper.db_action_insert); //module.setmoduleid(rs); module = moduleservice.selectbyprimarykey (rs); } else if (helper.f_action_edit.equals (action)) {rs = moduleservice.access (module, helper.db_action_update); module = moduleservice.selectbyprimarykey (module.getmoduleid ()); } else if (helper.f_action_remove.equals (action)) {rs = moduleservice.access (module, helper.db_action_delete); } else {return json.tojsonstring (новый результат (false, «ошибка параметра запроса: action»)); }} catch (Exception e) {e.printstackTrace (); return json.tojsonstring (новый результат (false », операция не удалась, произошло исключение, пожалуйста, свяжитесь с администратором!»)); } if (rs <0) {return json.tojsonstring (новый результат (false », операция не удалась, пожалуйста, свяжитесь с администратором!»); } return json.tojsonstring (новый результат (true, module)); }2.5 Запрос контроллера
@Requestmapping (value = "/accessDied", provectes = "text/html; charset = utf-8")@responsebodypublic string accessedied () {return json.tojsonstring (новый результат (false », у вас нет разрешения на работу по этому!»);};};};};};};};};2.6 Когда проверка запроса не удается, приведенный выше контроллер возвращает сам результат.
Как показано ниже:
{«Информация»: «У вас нет разрешения на работу по этому!», «Успех»: False}
2.7 Пример службы проверки функций
/ *** Проверьте разрешение текущего пользователя в определенной функции модуля* @param functionid* @return. Пустая строка указывает на разрешение, в противном случае это сообщение об ошибке* @throhs exception*/ public строка разрешений. // if (o == null) бросить новое AuthorizationException (); Sysuser Loginuser = (sysuser) O; if (loginuser.getUserid () == 1) return ""; try {return mapper.permissionValidate (loginuser.getUserid (), functionId); } catch (Exception ex) {ex.printstackTrace (); Вернуть «Исключение произошло в работе базы данных!»; }} Примечание. Здесь мы просто переполняем все методы пакета контроллера и его подпакунку с аннотациями @ValidatePermission и @Responsebody. Это определенно недостаточно универсально. Мы должны врезать метод с помощью @ValidatePermission. В классе раздела мы будем делать разные исключения, оценив, есть ли метод аннотации @Responsebody. Если вышеупомянутое исключение брошено, вышеупомянутое исключение брошено и возвращается в строку JSON.
В противном случае следует бросить другое пользовательское исключение, а запрос перенаправлен на законное представление, такое как error.jsp.
Отправить /moduleaccess.do запрос через клиент. Соответствующий метод запроса имеет как @ValidatePermission, так и @Responsebody, и имеет параметр идентификатора функции, так что AOP может ввести метод, выполнять уведомление о добе и использовать параметр функции для проверки его разрешений в сочетании с идентификатором пользователя. Если проверка пройдет, программа продолжит ее выполнять. В противном случае бросается пользовательское исключение. Исключение поймано системой (необходимо настроить обработчик исключений), и подается запрос вперед:/accesdyed, а соответствующий контроллер/доступ обрабатывает запрос и возвращает JSON, содержащий информацию об отказе проверки клиенту. Это отправляет запрос /moduleaccess.do. Если проверка не удается, переправьте запрос /доступ, в противном случае он будет выполняться нормально. Это было реализовано после того, как обошел такой большой круг.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.