springmvc拦截器
下面用springmvc拦截器对用户访问首页做一个简单的身份认证
1、spring-mvc.xml添加配置
<mvc:interceptors> <mvc:interceptor> <!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller --> <mvc:mapping path="/goindex.do" /> <bean class="com.frame.interceptor.CommonInterceptor"></bean> </mvc:interceptor> <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 --> </mvc:interceptors>
2、控制层
package com.frame.core.ctrl; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class loginCtrl { private static Logger log = Logger.getLogger(loginCtrl.class); @RequestMapping(value = "/goindex") public ModelAndView goindex() { ModelAndView mav = new ModelAndView("index"); mav.addObject("name", "笑傲江湖"); mav.addObject("projectName", "Freemarker框架"); return mav; } @RequestMapping(value = "/login") public void login(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { request.getSession().setAttribute("username", "身份认证成功"); request.getRequestDispatcher("/index.jsp").forward(request, response); } }
3、拦截器类
package com.frame.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; public class CommonInterceptor extends HandlerInterceptorAdapter{ private final Logger log = LoggerFactory.getLogger(CommonInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String requestUri = request.getRequestURI(); String contextPath = request.getContextPath(); String url = requestUri.substring(contextPath.length()); System.out.println("requestUri:"+requestUri); System.out.println("contextPath:"+contextPath); System.out.println("url:"+url); String username = (String)request.getSession().getAttribute("username"); if(username == null){ System.out.println("Interceptor:跳转到index页面!"); request.getRequestDispatcher("/index.jsp").forward(request, response); return false; }else return true; } /** * 在业务处理器处理请求执行完成后,生成视图之前执行的动作 * 可在modelAndView中加入数据 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { if(modelAndView != null){ modelAndView.addObject("var", "postHandle已处理"); } } /** * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 * * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion() */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
4、/webapp/index.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <body> <form action="<%=request.getContextPath()%>/login.do" method="post"> <input type="submit" value="登录" /> </form> <h2><a href="<%=request.getContextPath()%>/goindex.do">go</a></h2> <%=request.getSession().getAttribute("username") %> </body> </html>
5、/webapp/views/index.html
<!DOCTYPE html> <html lang="en" class="app"> <head> <@head/> </head> <body class=""> <@header/> <br/> <br/> <br/> <br/> middle <br/> <br/> <br/> <br/> <@footer/> </body> </html>
/webapp是springmvc整合freemarker时设置的web文件部署根目录
效果
index.jsp页面原始效果,session为null,用户没有访问go-index.html权限
点击登录,保存session,用户拥有访问go-index.html权限