採用annotation對spring-mvc進行登陸權限控制

在web系統中,判斷用戶是否登陸是一個經常使用功能. 本文提出一種採用annotation對spring-mvc進行用戶登陸判斷的方法.
程序源代碼html

方法簡介

創建一個annotation, 在須要登陸判斷的spring-mvc方法上進行標註. 再創建一個全局的spring-mvc的interceptor對spring-mvc方法進行過濾, 若是發現有annotation標註的, 就進行登陸判斷,對沒有登陸的用戶作對應的處理.java

優勢

採用一個過濾器, 在須要控制的方法上進行標註, 實現和編碼都比較簡單. 大道至簡:)git

###具體的實現案例
1.創建登陸判斷後返回給瀏覽器的結果類型, (這裏有兩種: 傳統登陸頁面或者ajax結果).github

<!-- lang: java -->
public enum ResultTypeEnum {
//整頁刷新
page, 
//json數據
json
}

2.創建annotation, 用於標註須要登陸檢查的spring-mvc方法web

<!-- lang: java -->
public @interface Login {
ResultTypeEnum value() default ResultTypeEnum.page;
}

3.創建用於過濾spring-mvc的interceptor類ajax

<!-- lang: java-->
public class LoginAnnotationInterceptor extends HandlerInterceptorAdapter {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

	HandlerMethod handler2 = (HandlerMethod) handler;
	Login login = handler2.getMethodAnnotation(Login.class);

	if (null == login) {
		// 沒有聲明權限,放行
		return true;
	}

	HttpSession session = request.getSession();
            //取得session中的用戶信息, 以便判斷是否登陸了系統
	Worker worker = (Worker) session.getAttribute(SessionHelper.WorkerHandler);

	if (null == worker) {
		// 須要登陸
		if (login.value() == ResultTypeEnum.page) {
			//傳統頁面的登陸
			request.getRequestDispatcher("/login.jsp?oprst=false&opmsg=請登陸!").forward(request, response);
		} else if (login.value() == ResultTypeEnum.json) {
			//ajax頁面的登陸
			response.setCharacterEncoding("utf-8");
			response.setContentType("text/html;charset=UTF-8");
			OutputStream out = response.getOutputStream();
			PrintWriter pw = new PrintWriter(new OutputStreamWriter(out,"utf-8"));
			//返回json格式的提示
			pw.println("{\"result\":false,\"code\":11,\"errorMessage\":\"您未登陸,請先登陸\"}");
			pw.flush();
			pw.close();
		}
		return false;
	}
	   return true;
    }
}

4.在spring的配置文件中配置interceptor, 從而過濾全部的spring-mvc方法spring

<!-- lang: xml -->
<mvc:interceptors>
    <bean class="LoginAnnotationInterceptor"></bean>
</mvc:interceptors>

5.在須要權限控制的方法上加上Login註解, 從而告訴interceptor該方法須要登陸檢查json

<!-- lang: java -->
@Login
@RequestMapping(value="/save.spr", method=RequestMethod.POST)
public ModelAndView save(SalesOrder salesOrder, HttpSession session) throws Exception {
    //您的代碼...	
}

另一個例子(ajax,Json)瀏覽器

<!-- lang: java -->
@Login(ResultTypeEnum.json)
@RequestMapping(value="/save.spr", method=RequestMethod.POST)
public ModelAndView save(SalesOrder salesOrder, HttpSession session) throws Exception {
    //您的代碼...	
}

完成了!spring-mvc

###總結 此方法好處是比較方便, 在須要登陸控制的地方,標註一下就能夠了. 另外若是再作一些修改, 能夠演變成基於annotation的權限控制, 我將在之後的文章中進行詳細說明.
程序源代碼

相關文章
相關標籤/搜索