很久木有寫博客了,可能最近換工作了,在適應的新的環境吧! 趁着今天晚上有時間把上次寫的案例在博客上講一下:
寫這個案例的原因是組長希望在目前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的內容,若是有需要;可以找我要源碼。