在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的权限控制, 我将在之后的文章中进行详细说明.
程序源代码