yycg之用户身份校验(二)

1.1     用户身份校验

实现步骤:

    校验用户存在

         校验密码合法

         构建用户身份信息

Action

 验证码校验

用户认证

将用户信息写入session

页面

Login.jsp 界面

预加载方法表单校验

退出编写

 

 

通常使用filter过虑器,本系统采用springmvc拦截器实现。

 

springmvc拦截器是基于处理器映射器HandlerMapping进行拦截。

在spring mvc.xml 中配置拦截器  针对mapper拦截 不是全局的

定义拦截器

可以采用一种方法定义一处拦截器,自动在每个HandlerMapping中进行注册。此部分可以参考我以前的博客  : http://blog.csdn.net/u012373815/article/details/47208565

 

<!-- 拦截器 -->

   <mvc:interceptors>

      <!-- 多个拦截器,顺序执行 -->

      <!-- 用户身份校验的拦截器 -->

      <mvc:interceptor>

         <mvc:mapping path="/**" />

         <bean class="yycg.base.filter.LoginInterceptor"></bean>

      </mvc:interceptor>

 

   </mvc:interceptors>

 

 

拦截器定义,需要实现HanlderInterceptor接口。

ResourcesUtil   ResultUtil  为工具类

 

//拦截器

//Springmvc  的拦截器  spring mvc.xml 中配置拦截器  针对mapper拦截不是全局的

public classLoginInterceptor implements HandlerInterceptor {

 

   // 执行时机:进入action方法之前执行

   // 使用场景:用于用户认证、用户授权拦截

   @Override

   public booleanpreHandle(HttpServletRequest request,

         HttpServletResponseresponse, Object handler) throws Exception {

     

      //校验用户合法性

      HttpSessionsession=request.getSession();

      ActiveUseractiveUser=(ActiveUser) session.getAttribute(Config.ACTIVEUSER_KEY);

      if(activeUser!=null)

      {//用户登录

         return true;

      }

      //用户是否访问公开链接

      List<String>open_urls=ResourcesUtil.gekeyList(Config.ANONYMOUS_ACTIONS);

      Stringurl=request.getRequestURI();

      for(Stringopen_url:open_urls)

      {//访问链接是否包含公共链接

         if(url.indexOf(open_url)>0)

         {//包含公共链接放行

            return true;

         }

      }

     

      //访问没有权限的地址拦截

      //request.getRequestDispatcher("WEB-INF/jsp/base/login.jsp").forward(request,response);

     

      //106异常需要登录执行本操作  。解决拦截器提交时session过期            提交被拦截问题无法响应登录页面问题

      ResultUtil.throwExcepion(ResultUtil.createWarning(Config.MESSAGE, 106, null));

      return true;

   }

 

   // 执行时机:进入action方法,在返回modelAndView之前执行

   // 使用场景:在这里统一对返回数据进行处理,比如统一添加菜单导航

   @Override

   public voidpostHandle(HttpServletRequest request,

         HttpServletResponseresponse, Object handler,

         ModelAndViewmodelAndView) throwsException {

     

 

   }

 

  

  

   // 执行时机:action方法执行完成,已经返回modelAndView,执行。

   // 使用场景:统一处理系统异常,在这里统一记录系统日志

   // ,监控action方法执行时间,在preHandle记录开始时间,在afterCompletion记录结束时间

   @Override

   public voidafterCompletion(HttpServletRequest request,

         HttpServletResponseresponse, Object handler, Exception ex)

         throws Exception {

      // TODO Auto-generated method stub

 

   }

1.1.1     配置公开资源地址

 yycg之用户身份校验(二)_第1张图片

 

取出该配置文件中公开地址:

 

使用工具类在,ResourcesUtil中的gekeyList方法在工具的工程里

package yycg.util;

 

import java.io.Serializable;

import java.text.MessageFormat;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

import java.util.Locale;

import java.util.ResourceBundle;

import java.util.Set;

 

/**

 * 资源文件读取工具类

 *

 */

public class ResourcesUtil implementsSerializable {

 

1.2     测试用户身份校验

 

1、请求系统首先(非公开地址)

自动跳转到登陆页面。

用户登陆,拦截器放行。

 

2、在嵌入的页面中,如果session过期了,跳转到登陆页面

现象:

登陆页面是嵌入在页面中。

 yycg之用户身份校验(二)_第2张图片

 

修改登陆提交的回调方法,

   //回首页

   function tofirst(){

      //window.location='${baseurl}first.action';

       if(parent.parent.parent){

          //让最外层页面执行跳转

         parent.parent.parent.location='${baseurl}first.action';

      }else if(parent.parent){

         parent.parent.location='${baseurl}first.action';

      }else if(parent){

         parent.location='${baseurl}first.action';

      }else{

         window.location='${baseurl}first.action';

      } 

    

   }

 

3、当执行一个提交操作时,session过期,应该跳转登陆页面

 

本系统提交返回是json(SubmitResultInfo) ,由于LoginInterceptor拦截器作用,拦截了,返回了登陆页面。

无法解析登陆页面内容。

 

解决:

在LoginInterceptor中,对需要跳转登陆页面,抛出106异常。

 

//106异常需要登录执行本操作  。解决拦截器提交时session过期            提交被拦截问题无法响应登录页面问题

      ResultUtil.throwExcepion(ResultUtil.createWarning(Config.MESSAGE, 106, null));

    

 

在全局异常处理器resolveException中解析106异常。

解析异常代码是否是106如果是106跳转登陆页面

String view="/base/error";

      //解析106异常

      intexception_code=exceptionResultInfo.getResultInfo().getMessageCode();

      if(exception_code==106)

      {

        view="/base/login";

      }

          

      // 发送异常倒页面

      request.setAttribute("exceptionResultInfo",

           exceptionResultInfo.getResultInfo());

      // 转向错误页面

      ModelAndViewmodelAndView = newModelAndView();

      modelAndView.addObject("exceptionResultInfo",

           exceptionResultInfo.getResultInfo());

      modelAndView.setViewName(view);

      return modelAndView;

你可能感兴趣的:(yycg之用户身份校验(二))