annotation 注解做springmvc 的登录权限校验案例

来源:互联网 发布:软件开发知识库 编辑:程序博客网 时间:2024/05/22 06:32

很久木有写博客了,可能最近换工作了,在适应的新的环境吧! 趁着今天晚上有时间把上次写的案例在博客上讲一下:

写这个案例的原因是组长希望在目前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)@Documentedpublic @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处理之前进行调用。 */@Overridepublic 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进行视图的渲染之前执行. */@Overridepublic void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {super.postHandle(request, response, handler, modelAndView);}/** * 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。 * 该方法将在整个请求完成之后,也就是DispatcherServlet渲染了视图执行,主要是用来清理释放资源的 */@Overridepublic 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")@ResponseBodypublic 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的内容,若是有需要;可以找我要源码。




0 0
原创粉丝点击