SpringMvc拦截器编写登录验证跳转
今天再在这篇文章中说一下我的体会,很多时候我做东西仅仅只是做东西,东西做好了没有理解其深意,仅仅是套用已有的内容以求达到快速实现结果的目的,而忽略了从中学到东西的深入的理解,要理解其本质,才能做到融会贯通,举一反三。
分为三部分:1.拦截器的配置。2.网页的重定向。3.控制器的编写
1.拦截器的实现:首先在配置Springmvc.xml中添加拦截器的设置,Springmvc.xml存在的位置是resource中
通过mvc:interceptors定义Spring MVC拦截器
通过mvc:mapping path设置被拦截的路径
通过mvc:exclude-mapping path设置不拦截的路径
通过bean class装配拦截器
Springmvc.xml中对应的内容的设置为:
<!-- 过滤器的配置 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/CabsSeting/*.html"/> <mvc:exclude-mapping path="/CabsSeting/login.html"/> <bean id="LoginInterceptor" class="cas.rssi.controller.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
关于路径的我的理解:
- "/"表示的javaweb项目的根目录,所谓的根目录是war包在tomcat下解压后的目录,
- CabsSeting是html文件的目录
- <mvc:mapping path="/CabsSeting/*.html"/> 表示:需要拦截根目录下的CabsSeting目录下的所有的html(这种方式也可以实现:<mvc:mapping path="/**"/>,但这中方式可能对其他目录下的html文件产生影响,因为它表示的意思是根目录下的所有目录和其子目录)
- <mvc:exclude-mapping path="/CabsSeting/login.html"/> 表示:根目录下的CabsSeting目录下的login.html不会被拦截
这样拦截器就会把CabsSeting下的除login.html的所有html拦截
编写拦截器,类似于面向切面编程,当访问所有的除login.html地址时都会执行对应的函数,这里是进行跳转
2.拦截器编写:对应的位置由上面的bean中的class而得到的:cas.rssi.controller.LoginInterceptor
对应的内容为:
package cas.rssi.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class LoginInterceptor implements HandlerInterceptor { protected Logger logger = LoggerFactory.getLogger(getClass()); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object user = request.getSession().getAttribute("password"); if (user == null) { logger.info("has not login!"); response.sendRedirect("login.html");//编写要跳转的页面,若login.html与访问的被拦截的页面在同一目录下,可直接填写,若不在 return false; //同一目录,则需要填写的内容可以保证跳转到对应的页面 } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion"); } }
3.控制器的编写
控制器是与前端进行交互的部分,此处我只做简单的说明,具体的前后端的交互可以参考另一博文
控制器对应的程序为:
@RequestMapping("/coverseting")
public resultSet setCover(HttpServletRequest servletReq, @RequestBody CoverageSet req) throws Exception {
logger.info("step into the setCover "+req.toString());
String password;
resultSet r=new resultSet();
int rsp = ConfigApi.setCoverage(req);
r.setStatus(rsp);
return r;
}
@RequestMapping("/loginSeting") public resultSet loginConfirm(HttpServletRequest servletReq, @RequestBody loginSet req) throws Exception{ logger.info("step into the setNMC "+req.toString()); HttpSession session=servletReq.getSession(); session.setAttribute("password", "123456"); resultSet r=new resultSet(); int rsp=0; if(req.getPassword().equals("123456")) { rsp=0; } else { rsp=1; } r.setStatus(rsp); return r; }
说明:loginSet是我自己编写的类,与接收前端的结构相同,当通过网址访问coverseting时,会先跳转到login所在的页面,经过验证后才会跳转至coverseting所对应的页面