annotation 註解做springmvc 的登錄權限校驗案例

很久木有寫博客了,可能最近換工作了,在適應的新的環境吧! 趁着今天晚上有時間把上次寫的案例在博客上講一下:

寫這個案例的原因是組長希望在目前springMvc 項目下 能用註解來管理登陸的權限!接下來來講一下吧!

(1)首先創建一個枚舉類:

原因是 我們使用界面一般有兩種情況,第一種是ajax的請求(也就是所謂的異步請求),還有就是整個頁面刷新,我們把這兩種請求用枚舉表示

package com.zeng.annotation.authority;
/**
 * 
 * @author Administrator
 *
 */
public enum ResultType {
	//頁面刷新
	page,
	//json類型
	json;
}
(2)然後是創建註解類

package com.zeng.annotation.authority;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 創建annotation,用於標註需要登錄檢查的spring-mvc方法;
 * 【注】:@interface 和interface  是兩碼事:前者是定義annotation類,或者是定義接口
 * @author leo
 *
 */
@Target(ElementType.METHOD)  //註明註解中有方法
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Login {
	/**
	 * 默認的是page
	 * @return
	 */
	ResultType value() default ResultType.page;
}
(3)其次,創建攔截校驗url的攔截器,其實攔截器是整個功能的核心件;(注:當然做登陸權限校驗最佳選擇還是filter,)

package com.zeng.annotation.interceptor;

import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;


import com.zeng.annotation.authority.Login;
import com.zeng.annotation.authority.ResultType;
import com.zeng.annotation.entity.User;

/**
 * 登錄權限校驗攔截器
 * 
 * @author leo
 *
 */
public class LoginInterceptor extends HandlerInterceptorAdapter {
	/**
	 *  preHandle方法是進行處理器攔截用的,顧名思義,該方法將在Controller處理之前進行調用。
	 */
	@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();
		User user =(User) session.getAttribute("user");
		//用戶未登錄
		if(null ==user){
			//採用傳統頁面刷新的
			if(login.value()==ResultType.page){
				request.getRequestDispatcher("/login/getLogin?oprst=false&opmsg=請登錄!").forward(request, response);
			}else if(login.value()==ResultType.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"));
				pw.println("{\"result\":false,\"code\":11,\"errorMessage\":\"您未登錄,請先登錄\"}");
				pw.flush();
				pw.close();	
			}
			return false;
		}
		return true;
	}
	/**
	 * 這個方法只會在當前這個Interceptor的preHandle方法返回值爲true的時候纔會執行。
	 * postHandle是進行處理器攔截用的,它的執行時間是在處理器進行處理之 後,
	 *也就是在Controller方法調用後執行,但是會在DispatcherServlet進行視圖的渲染之前執行.
	 */
	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		super.postHandle(request, response, handler, modelAndView);
	}
	/**
	 * 該方法也是需要當前對應的Interceptor的preHandle方法的返回值爲true時纔會執行。
	 * 該方法將在整個請求完成之後,也就是DispatcherServlet渲染了視圖執行,主要是用來清理釋放資源的
	 */
	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		super.afterCompletion(request, response, handler, ex);
	}
}
(4)接下來在springmvc.xml 中配置攔截器,強調一下我們這裏重點不是將springmvc,所以我這裏忽略springmvc 的搭建和在web.xml中配置(將在後面專門講下spring webmvc的自己demo);

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation=" 
           http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
           http://www.springframework.org/schema/context 
           http://www.springframework.org/schema/context/spring-context-4.0.xsd 
           http://www.springframework.org/schema/mvc 
           http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
           http://www.springframework.org/schema/task  
		   http://www.springframework.org/schema/task/spring-task-4.0.xsd"
	default-autowire="byName" >
	<!-- 開啓spring mvc 的註解模式 -->
	<mvc:annotation-driven />
	<!-- 配置攔截器 -->
	<mvc:interceptors>
		<bean class="com.zeng.annotation.interceptor.LoginInterceptor"/>
	</mvc:interceptors>
	<!-- ①:對mvc包中的所有類進行掃描,以完成Bean創建和自動依賴注入的功能 -->
	<context:component-scan base-package="com.zeng.annotation.controller" />
   
	<!-- 處理在類級別上的@RequestMapping註解  -->
	<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />

	<!-- 處理方法級別上的@RequestMapping註解 -->
	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="cacheSeconds" value="0" />
		<!-- 配置一下對json數據的轉換 -->
		<property name="messageConverters">
			<list>
				<bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
			        <property name="supportedMediaTypes">
			            <list>
			                <value>application/json;charset=UTF-8</value>
			                <value>application/html;charset=UTF-8</value>			                
			            </list>
			        </property>
			    </bean>				    
			</list>
		</property>
		<!-- @Controller 注入bean參數註解支持 -->
		<property name="webBindingInitializer">  
		    <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">  
		        <property name="conversionService">  
		            <bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean"></bean>  
		        </property>  
		    </bean>  
		</property>  
	</bean>	
	<!-- ③:對模型視圖名稱的解析,即在模型視圖名稱添加前後綴  -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
		<property name="prefix" value="/WEB-INF/jsp/"></property>
		<property name="suffix" value=".jsp"></property><!--可爲空,方便實現自已的依據擴展名來選擇視圖解釋類的邏輯  --> 
	</bean>
</beans>	
(5)接下來controller中配置上登陸權限驗證的註解

package com.zeng.annotation.controller;



import java.util.ArrayList;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.zeng.annotation.authority.Login;
import com.zeng.annotation.authority.ResultType;
import com.zeng.annotation.entity.User;

@Controller
@RequestMapping("user")
public class UserController {
	/**
	 * 添加登錄校驗註解
	 * @param model
	 * @return
	 */
	@Login
	@RequestMapping("getUser")
	public String getUser(Model model){
		model.addAttribute("message", "歡迎來到用戶界面");
		return "/user";
	}

	@RequestMapping("findUser")
	public String findUser(Model model){
		model.addAttribute("message", "歡迎來到用戶界面");
		return "/user2";
	}
	/**
	 * ajax的類型登錄校驗註解
	 * @param model
	 * @return
	 */
	@Login(ResultType.json)
	@RequestMapping("getUsers")
	@ResponseBody
	public Object userList(Model model){
		ArrayList<User> userList = new ArrayList<User>();
		for (int i = 0; i < 3; i++) {
			User user = new User();
			user.setLoginName("leo"+i);
			user.setPswd(123+i+"");
			userList.add(user);
		}
		return userList;
	}
}
基本上一個demo 就這樣結束了,這裏面忽略springmvc 的配置和前臺jsp的內容,若是有需要;可以找我要源碼。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章