在web系统中,判断用户是否登录是一个常用功能. 本文提出一种采用annotation对spring-mvc进行用户登录判断的方法.
程序源代码
建立一个annotation, 在需要登录判断的spring-mvc方法上进行标注. 再建立一个全局的spring-mvc的interceptor对spring-mvc方法进行过滤, 如果发现有annotation标注的, 就进行登录判断,对没有登录的用户做对应的处理.
采用一个过滤器, 在需要控制的方法上进行标注, 实现和编码都比较简单. 大道至简:)
1.建立登录判断后返回给浏览器的结果类型, (这里有两种: 传统登录页面或者ajax结果).
public enum ResultTypeEnum {
//整页刷新
page,
//json数据
json
}
2.建立annotation, 用于标注需要登录检查的spring-mvc方法
public @interface Login {
ResultTypeEnum value() default ResultTypeEnum.page;
}
3.建立用于过滤spring-mvc的interceptor类
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方法
<mvc:interceptors>
<bean class="LoginAnnotationInterceptor"></bean>
</mvc:interceptors>
5.在需要权限控制的方法上加上Login注解, 从而告诉interceptor该方法需要登录检查
@Login
@RequestMapping(value="/save.spr", method=RequestMethod.POST)
public ModelAndView save(SalesOrder salesOrder, HttpSession session) throws Exception {
//您的代码...
}
另外一个例子(ajax,Json)
@Login(ResultTypeEnum.json)
@RequestMapping(value="/save.spr", method=RequestMethod.POST)
public ModelAndView save(SalesOrder salesOrder, HttpSession session) throws Exception {
//您的代码...
}
完成了!
此方法好处是比较方便, 在需要登录控制的地方,标注一下就可以了. 另外如果再做一些修改, 可以演变成基于annotation的权限控制, 我将在以后的文章中进行详细说明.
程序源代码