四. 配置常见的登录拦截器
四.一 创建登录拦截器 LoginInterceptor (重点)
LoginInterceptor.java
package com.yjl.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.ui.Model; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import com.yjl.pojo.User; public class LoginInterceptor implements HandlerInterceptor{ @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception { //获取请求的地址 String uri=request.getRequestURI(); //不需要拦截的地址, 可以放置在 springmvc.xml 中进行配置。 String [] excludeURI=new String[]{"toLogin","login","toRegister","register","forgetPassword"}; for(String str:excludeURI){ if(uri.indexOf(str)>=0){ //如果包含,就直接通过。 return true; } } HttpSession session=request.getSession(); Object sessionObj=session.getAttribute("userLogin"); if(sessionObj!=null){ //如果不能转换,会报类型转换异常的。 User user=(User)sessionObj; if(user!=null){ return true; } } //来替换 toLogin 里面的 model设置值。 request.setAttribute("user",new User()); request.getRequestDispatcher("/WEB-INF/jsp/user/login.jsp").forward(request, response); return false; } }
四.二 后端 UserAction
@Controller @RequestMapping(value="/user") public class UserAction { //转到登录的页面 @RequestMapping(value="toLogin") public String toLogin(Model model){ model.addAttribute("user",new User()); System.out.println("执行toLogin方法"); return "user/login"; } @RequestMapping(value="login") public String login(User user,HttpSession session){ System.out.println("执行Login方法"); if("两个蝴蝶飞".equals(user.getName())&&"1234".equals(user.getPassword())) { session.setAttribute("userLogin", user); return "user/list"; }else{ return "user/login"; } } @RequestMapping(value="list") public String list(){ //执行list方法 return "user/list"; } @RequestMapping(value="toRegister") public String toRegister(){ return "user/register"; } @RequestMapping(value="logout") public String logout(HttpSession session,Model model){ session.invalidate(); model.addAttribute("user",new User()); System.out.println("执行logout方法"); return "user/login"; } }
四.三 前端 login.jsp 页面
<body> <h2>两个蝴蝶飞,拦截器使用</h2> <form:form action="login" commandName="user" type="post"> <form:label path="name">用户名:</form:label> <form:input path="name"/><br/> <form:label path="password">密码:</form:label> <form:input path="password"/><br/> <form:button>提交</form:button> </form:form> </body>
四.四 登录成功后的 list.jsp 页面 和注册register.jsp
list.jsp
里面有注销的链接,来清除session
<body> 员工${user.name} <a href="logout">注销</a> </body>
为了更详细的验证, 多添加一个 DeptAction 和 dept/list.jsp 页面
register.jsp
<body> 注册页面 </body>
四.五 详细验证,添加Dept的信息
DeptAction.java
@Controller @RequestMapping(value="/dept") public class DeptAction { //转到登录的页面 @RequestMapping(value="list") public String list(){ return "dept/list"; } }
dept/ list.jsp 页面
<body> 部门列表 </body>
四.六 springmvc.xml 配置登录拦截器 (重点)
<mvc:annotation-driven></mvc:annotation-driven> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.yjl.interceptor.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
四.七 重启服务器,进行验证
直接输入 : http://localhost:8027/SpringMVC09/dept/list 来访问部门,会跳转到登录的页面。
直接输入 : http://localhost:8027/SpringMVC09/user/logout ,会跳转到登录的页面。
直接输入 : http://localhost:8027/SpringMVC09/user/toRegister,会跳转到注册的页面
当然,输入一个不存在的网址,如 http://localhost:8027/SpringMVC09/user/yuejl, 还是会报404的问题的。
在登录页面,输入 两个蝴蝶飞和1234时,
会跳转到 user/list.jsp 页面
这个时候,再新开一个窗口,不要关闭浏览器。
直接输入: http://localhost:8027/SpringMVC09/dept/list
会显示部门列表,到 dept/list.jsp 页面
在user/list.jsp 页面,点击 注销, 注销后会跳转到 登录的页面。
再刷新刚才打开的那个窗口 dept/list.jsp 页面,发现会跳转到 登录的页面。
拦截器是正确的。
四.八 将拦截的网址放置在 springmvc.xml 中进行配置
LoginInterceptor.java 的 preHandle() 方法去掉 验证。
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception { //获取请求的地址 String uri=request.getRequestURI(); //不需要拦截的地址 /* String [] excludeURI=new String[]{"toLogin","login","toRegister","register","forgetPassword"}; for(String str:excludeURI){ if(uri.indexOf(str)>=0){ //如果包含,就直接通过。 return true; } } */ HttpSession session=request.getSession(); Object sessionObj=session.getAttribute("userLogin"); if(sessionObj!=null){ //如果不能转换,会报类型转换异常的。 User user=(User)sessionObj; if(user!=null){ return true; } } //来替换 toLogin 里面的 model设置值。 request.setAttribute("user",new User()); request.getRequestDispatcher("/WEB-INF/jsp/user/login.jsp").forward(request, response); return false; }
springmvc.xml 中进行配置 <mvc:exclude-mapping
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/user/toLogin"/> <mvc:exclude-mapping path="/user/login"/> <mvc:exclude-mapping path="/user/toRegister"/> <mvc:exclude-mapping path="/user/register"/> <mvc:exclude-mapping path="/user/forgetPassword"/> <bean class="com.yjl.interceptor.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
重启服务器,进行验证, 与 四.七 的结果一致。 建议使用 四.八的配置方法。
谢谢!!!