实现步骤:
校验用户存在
校验密码合法
构建用户身份信息
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 配置公开资源地址
取出该配置文件中公开地址:
使用工具类在,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、在嵌入的页面中,如果session过期了,跳转到登陆页面
现象:
登陆页面是嵌入在页面中。
修改登陆提交的回调方法,
//回首页
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;