spring aop 攔截業(yè)務(wù)方法,實(shí)現(xiàn)權(quán)限控制示例
難點(diǎn):aop類是普通的java類,session是無法注入的,那么在有狀態(tài)的系統(tǒng)中如何獲取用戶相關(guān)信息呢,session是必經(jīng)之路啊,獲取session就變的很重要。思索很久沒有辦法,后來在網(wǎng)上看到了解決辦法。
思路是:
i. SysContext 成員變量 request,session,response
ii. Filter 目的是給 SysContext 中的成員賦值
iii.然后在AOP中使用這個(gè)SysContext的值
要用好,需要理解 ThreadLocal和 和Filter 執(zhí)行順序
1.aop獲取request,response,session等
public class SysContext {
private static ThreadLocal<HttpServletRequest> requestLocal=new ThreadLocal<HttpServletRequest>();
private static ThreadLocal<HttpServletResponse> responseLocal=new ThreadLocal<HttpServletResponse>();
public static HttpServletRequest getRequest(){
return requestLocalget();
}
public static void setRequest(HttpServletRequest request){
requestLocalset(request);
}
public static HttpServletResponse getResponse(){
return responseLocalget();
}
public static void setResponse(HttpServletResponse response){
responseLocalset(response);
}
public static HttpSession getSession(){
return (HttpSession)(getRequest())getSession();
}
}
2.添加過濾器
public class GetContextFilter implements Filter{
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
SysContextsetRequest((HttpServletRequest)request);
SysContextsetResponse((HttpServletResponse)response);
chaindoFilter(request, response);
}
@Override
public void init(FilterConfig config) throws ServletException {
}
}
3.配置web.xml
將這部分放置在最前面,這樣可以過濾到所有的請(qǐng)求
<filter> <filter-name>sessionFilter</filter-name> <filter-class>comuneifilterGetContextFilter</filter-class> </filter> <filter-mapping> <filter-name>sessionFilter</filter-name> <url-pattern>*</url-pattern> </filter-mapping>
4.spring aop before
從session中取出用戶名,如果不存在,拋出異常跳轉(zhuǎn),將錯(cuò)誤信息放到request中
@Aspect
public class AdminAspect {
ActionContext context = ActionContextgetContext();
HttpServletRequest request;
HttpServletResponse response;
@Before("execution(* comuneiActionAdminActiongetPrivileges())")
public void adminPrivilegeCheck()
throws Throwable {
HttpSession session = SysContextgetSession();
request = SysContextgetRequest();
response = SysContextgetResponse();
String userName = "";
try {
userName = sessiongetAttribute("userName")toString();
if(userName==null||userNameequals(""))
throw new Exception("no privilege");
} catch (Exception ex) {
requestsetAttribute("msg", "{\"res\":\"" + "無權(quán)限" + "\"}");
try {
requestgetRequestDispatcher("/jsp/jsonjsp")forward(
request, response);
} catch (ServletException e) {
eprintStackTrace();
} catch (IOException e) {
eprintStackTrace();
}
}
}
}
5.applicationContext.xml
<bean id="adminAspect" class="comuneiaopAdminAspect"></bean>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Mybatis generator修改Mapper.java文件實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Mybatis generator修改Mapper.java文件實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
java中LinkedBlockingQueue與ArrayBlockingQueue的異同
這篇文章主要介紹了java中LinkedBlockingQueue與ArrayBlockingQueue的異同,需要的朋友可以參考下2016-08-08
idea2019.1.4 鼠標(biāo)放到方法上顯示注解的實(shí)現(xiàn)操作
這篇文章主要介紹了idea2019.1.4 鼠標(biāo)放到方法上顯示注解的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02
詳解Java中的字節(jié)碼增強(qiáng)技術(shù)
字節(jié)碼增強(qiáng)技術(shù)就是一類對(duì)現(xiàn)有字節(jié)碼進(jìn)行修改或者動(dòng)態(tài)生成全新字節(jié)碼文件的技術(shù)。本文將通過示例詳細(xì)說說Java的字節(jié)碼增強(qiáng)技術(shù),需要的可以參考一下2022-10-10
SpringMVC獲取請(qǐng)求參數(shù)筆記整理
本文記錄和分享在學(xué)習(xí)Spring MVC過程中的筆記,通過案例示例代碼分析給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
mybatis-plus中wrapper的用法實(shí)例詳解
本文給大家介紹了mybatis-plus中wrapper的用法,包括條件構(gòu)造器關(guān)系、項(xiàng)目實(shí)例及具體使用操作,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02

