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所对应的页面

 

posted @ 2018-09-05 09:44  知更之始,博之于涵  阅读(384)  评论(0编辑  收藏  举报